如何在WebView与NSURLConnection、NSURLSession间共享Cookie?
因为WebView会自动将登录后的Cookie写入应用共享的HTTPCookieStorage,所以NSURLConnection和NSURLSession在默认配置下都能直接复用这些Cookie,以下是具体实现方式和注意事项:
一、NSURLConnection 复用Cookie
1. 默认自动复用
NSURLConnection发起请求时,会自动从共享的HTTPCookieStorage中匹配对应域名的Cookie并添加到请求头,无需额外操作:
NSURL *targetUrl = [NSURL URLWithString:@"https://your-target-domain.com/api/resource"]; NSURLRequest *request = [NSURLRequest requestWithURL:targetUrl]; NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; [connection start];
2. 手动强制添加Cookie(适用于自动匹配失败场景)
若遇到Cookie未自动带上的情况,可手动从存储中提取对应Cookie并添加到请求头:
NSURL *targetUrl = [NSURL URLWithString:@"https://your-target-domain.com/api/resource"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:targetUrl]; // 获取目标域名下的所有Cookie NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:targetUrl]; if (cookies.count > 0) { // 将Cookie转换为标准请求头格式 NSString *cookieHeader = [NSHTTPCookie requestHeaderFieldsWithCookies:cookies]; [request setValue:cookieHeader[@"Cookie"] forHTTPHeaderField:@"Cookie"]; } NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; [connection start];
二、NSURLSession 复用Cookie
1. 默认配置自动复用
使用defaultSessionConfiguration创建的NSURLSession,会自动绑定共享的HTTPCookieStorage,请求将自动带上WebView设置的Cookie:
NSURL *targetUrl = [NSURL URLWithString:@"https://your-target-domain.com/api/resource"]; NSURLRequest *request = [NSURLRequest requestWithURL:targetUrl]; NSURLSession *session = [NSURLSession sharedSession]; NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { // 处理响应数据 }]; [task resume];
2. 自定义配置确保复用Cookie
若使用自定义配置,需避免使用临时Cookie存储(如ephemeralSessionConfiguration),显式绑定共享存储:
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; // 显式指定使用共享Cookie存储(默认已开启,此处为明确说明) config.HTTPCookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; NSURLSession *session = [NSURLSession sessionWithConfiguration:config]; // 后续发起请求步骤同上
3. 手动添加Cookie(同NSURLConnection逻辑)
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:targetUrl]; NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:targetUrl]; if (cookies.count > 0) { NSString *cookieHeader = [NSHTTPCookie requestHeaderFieldsWithCookies:cookies]; [request setValue:cookieHeader[@"Cookie"] forHTTPHeaderField:@"Cookie"]; } NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:...]; [task resume];
关键注意事项
- Cookie匹配规则:确保Cookie的域(domain)和路径(path)与请求URL完全匹配,例如WebView登录域为
example.com,若请求子域api.example.com,需Cookie的域设置为.example.com(带前缀点)才能跨子域复用。 - Cookie有效期:检查WebView设置的Cookie过期时间,过期Cookie会被自动从存储中移除,无法复用。
- ATS配置:若应用开启了App Transport Security,需确保目标域名在ATS允许范围内,避免因ATS限制导致请求失败(与Cookie无关但易混淆问题)。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

