iOS 中的 HTTP 会话 cookie

HTTP session cookies in iOS

我是新手 iOS 开发人员。我有一个需要登录的应用程序,它具有通过应用程序发出 HTTP 请求的功能。根据我的理解,当发生登录时,服务器会向应用程序发送一个唯一的会话 cookie,我们需要在同一会话中将其用于其他 HTTP 请求。我发出 HTTP 请求的方法如下。我的应用程序中的所有请求都使用相同的方法。

+ (NSData*)makeHTTPPostRequestToURL:(NSURL *)url withPostString:(NSString *)postString{

    if (!postString)
    {
        postString = [NSString stringWithFormat:@""];
    }

    NSMutableURLRequest* urlRequest = [NSMutableURLRequest requestWithURL:url];

    NSString *authStr = [NSString stringWithFormat:@"genuser:genuser"];
    NSData *authData = [authStr dataUsingEncoding:NSASCIIStringEncoding];
    NSString *authValue = [NSString stringWithFormat:@"Basic %@", [authData base64EncodedStringWithOptions:0]];
    [urlRequest setHTTPMethod:@"POST"];
    [urlRequest setValue:authValue forHTTPHeaderField:@"Authorization"];
    [urlRequest setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [urlRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    [urlRequest setValue:[NSString stringWithFormat:@"%lu", (unsigned long)postString.length] forHTTPHeaderField:@"Content-Length"];
    postString =[self specialencoding:NSUTF8StringEncoding :postString ];

    NSLog(@"Request log is %@", postString);

    [urlRequest setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]];
    NSLog(@"POST:ESCAPED:%@",postString);
    NSHTTPURLResponse* urlResponse = nil;
    NSError* error = nil;

    NSData* responseData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&urlResponse error:&error];

    return responseData;
}   

如您所见,我在同一会话中发出请求时没有使用 cookie。所有请求都可以正常工作。我怀疑如果不发送 cookie,请求将如何在同一会话中提供服务。 iOS 是否为每个应用程序保存最后收到的 cookie,并将其附加到应用程序发出的进一步请求中。任何见解?

所以发生的事情是发回的 cookie 存储在 NSHTTPCookieStorage 对象中。每当请求被发送回与 cookie 域和路径匹配的 URL 时,cookie 将随请求一起自动发送。

检查特定域有哪些 cookie:

let url = NSURL(string: "https://yourcookiedomain.com")!;
let cookieStorage = NSHTTPCookieStorage.sharedHTTPCookieStorage();
let cookies = cookieStorage.cookiesForURL(url) as Array<NSHTTPCookie>;

var cookie: NSHTTPCookie? = nil;
for c in cookies {
    if (c.name == "cookie_name") {
       cookie = c;
       break;
    }
}