ios - 使用 NSURLSession 设置 cookie

标签 ios session-cookies nsurlsession

您好,我正在开发一个 Iphone 应用程序,我想在服务器响应后设置 cookie,并将其用于另一个请求。我的网络请求看起来像。

NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
    NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response;
    NSLog(@"sttaus code %i", httpResp.statusCode);
    if (error) {
        [self.delegate signinWithError:error];
    }
    else {
        [self.delegate signinWithJson:data];
    }
}] resume];

但是我不知道怎么设置cookies。我知道我必须使用 NSHTTPCookieStorage 但我不知道如何设置。我还想将该 cookie 用于另一个请求。有没有人知道这件事?需要帮忙。谢谢。

看我这样试过

NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{      
    if(error) {
        [self.delegate signinWithError:error];
    }
    else {
        NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response;

        [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];
        NSHTTPCookie *cookie;

        NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];

        NSDictionary* headers = [(NSHTTPURLResponse *)response allHeaderFields];

        for(NSString *key in [headers allKeys]) {
            NSLog(@"%@ ..PPPP ... %@",key ,[headers objectForKey:key]);
            [cookieProperties setObject:[headers objectForKey:key] forKey:key];
        }

        [cookieProperties setObject:[[NSDate date] dateByAddingTimeInterval:2629743] forKey:NSHTTPCookieExpires];

        cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
        [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];

        [self.delegate signinWithJson:data];
    }
}] resume];

我只对一个头字段感兴趣 Set-Cookie SSID=kgu62c0fops35n6qbf12anqlo7;路径=/

最佳答案

您可能只需使用 sharedHTTPCookieStorage 就可以逃脱对于 NSHTTPCookieStorage , 然后使用 setCookies:forURL:mainDocumentURL:或单个 setCookie: - 后者可能更适合您的需求。

如果这不起作用,您可能需要设置 NSURLSessionConfiguration并设置 NSHTTPCookieStorage

文档没有说明,但是 defaultSessionConfiguration无论如何都可能使用共享存储。

NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
    NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response;

    NSArray *cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:[response allHeaderFields] forURL:[response URL]];
    [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookies:cookies forURL:[response URL] mainDocumentURL:nil];

    NSLog(@"sttaus code %i", httpResp.statusCode);
    if (error) {
        [self.delegate signinWithError:error];
    }
    else {
        [self.delegate signinWithJson:data];
    }
}] resume];

关于ios - 使用 NSURLSession 设置 cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23218242/

相关文章:

ios - 快速下载任务与请求文件下载不起作用

ios - 如何从服务器中删除 JSON 形式的食谱?

iphone - 私有(private)接口(interface)和多个实现

ios - 为什么 Social.localUser.Authenticate 在 Unity 应用程序没有互联网连接时会导致崩溃?

ios - iOS 有类似 CameraUpdateFactory 的东西吗?

session - 在 Grails 中使用基于范围的服务时的问题

cookies - 如何使用javascript在用户本地存储上保存超过4kb的数据?

asp.net - 浏览器何时删除 session cookie?

ios - keyboardFrameEndUserInfoKey 没有显示正确的值?

swift - HTTPS 代理到 URLSession