如何使用AFNetworking永久保存cookie,直到从iPhone删除应用程序?

时间:2013-09-01 06:26:36

标签: ios cookies afnetworking

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

用例是在成功通过Web服务进行身份验证后,它为我提供了两个cookie,我需要传递每个请求。这些cookie永远不会过期,或者从现在开始过期。只要我有每个HTTPS请求的cookie,用户就不必再次登录。我知道AFNetworking会自动保留cookie,直到你退出应用程序,但我需要cookie一直持续到用户从手机中删除应用程序。

1)验证成功后,网络服务会给我两个cookie。我如何访问它们?我是否直接进入NSHTTPCookie存储并以其名称获取cookie,或者是否有AFNetworking“方式”来执行此操作?

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

3)如何以AFNetworking的方式删除这些cookie?

谢谢!

1 个答案:

答案 0 :(得分:19)

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. This answer表示要在Cookie上设置过期日期。如果您想自己保留cookie,可以将cookie转换为字典并保存。 This answer说使用钥匙串。

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

    NSArray* cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:theUrl];
    for (NSHTTPCookie* cookie in cookies) {
       [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
    }