11

有人可以告诉我如何使用 AFNetworking for iOS 永久保存 cookie 吗?我正在使用 ios7 但我认为这不重要吗?

用例是,在使用 Web 服务成功进行身份验证后,它会为我提供两个 cookie,我需要将它们与每个请求一起传递。这些 cookie 永不过期,或从现在起数年后过期。只要我有每个 HTTPS 请求的 cookie,用户就不必再次登录。我了解 AFNetworking 会自动保留 cookie,直到您退出应用程序,但我需要 cookie 永久保存,直到用户从手机中删除应用程序。

1) 身份验证成功后,web 服务给我两个 cookie。我如何访问它们?我是直接去 NSHTTPCookie 存储并按其名称获取 cookie,还是有 AFNetworking 的“方法”来做到这一点?

2)我如何永久保存这两个魔术cookie,以便我的 AFHTTPClient 子类将这两个魔术cookie与每个请求一起传递?我只是将它们保存在钥匙串或 NSUserDefaults 或 NSURLCredentialsStorage 中吗?还是有一种 AFNetworking 方法可以做到这一点?我在 AFNetworking 中读到了 setAuthorization() 方法,但我不确定这是否也适用于用户名/密码和 cookie。

3) 如何通过 AFNetworking 方式删除这些 cookie?

谢谢!!

4

1 回答 1

20

AFNetworking 没有明确地对 cookie 做任何事情,因此没有处理 cookie 的“AFNetworking 方式”。您将使用 NSHTTPCookie 和 NSHTTPCookieStorage。

在我的项目中,我不需要对请求做任何特定的事情来让它们使用 cookie。如果您需要与 AFNetworking 默认提供的请求行为不同的请求行为,请requestWithMethod:path:parameters:AFHTTPClient子类中覆盖。

  1. 获取从 AFJSONRequest 返回的 cookie,例如

    NSURLRequest* request = <some request returned from your AFHTTPClient subclass>
    AFJSONRequestOperation* op = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
     success:^(NSURLRequest* request, NSHTTPURLResponse* response, id userData) {
        NSArray* cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:[response allHeaderFields] forURL:url];
     }
     failure:...
    
  2. 这个答案说要在 cookie 上设置过期日期。如果您想自己保留 cookie,可以将 cookie 转换为字典并保存。这个答案说使用钥匙串。

    NSMutableDictionary* cookieDictionary = [NSMutableDictionary dictionaryWithDictionary:cookiePrefs];
    for (NSHTTPCookie* cookie in cookies) {
       [cookieDictionary setValue:cookie.properties forKey:cookie.name];
    }
    
  3. 从 NSHTTPCookieStorage 中删除 cookie。有一些技巧需要注意。如果您自己保存了 cookie,请删除存储的值,但这是适当的。

    NSArray* cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:theUrl];
    for (NSHTTPCookie* cookie in cookies) {
       [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
    }
    
于 2013-09-04T01:50:30.943 回答