iOS App - 如何使用AFNetworking 2实现自动会话cookie刷新

d37*_*3ur 5 authentication cookies session ios afnetworking-2

我正在开发一个iOS应用程序(使用AFNetworking 2,AFURLSessionManager),我必须与我无法控制的API进行交互(如果这有任何区别,则使用Symfony PHP框架).

问题是:用户有一个帐户.在应用程序首次启动时,用户将获得基于表单的登录屏幕.他们登录,然后获取会话cookie.Cookie会在30分钟后到期.它将在客户进行的每次通话中自行更新.但是,如果重新启动应用程序,cookie将被删除,如果应用程序闲置超过30分钟,则cookie将变为无效.

我在这里有很多困难.首先,我需要透明地进行登录调用,因此用户无需重新登录.所以我得到了错误响应并且我发出了登录请求,并且在成功时我重新创建了原始请求.现在的问题是,可能会发生多个同时发生的请求,并将其与移动网络连接的不可靠性联系起来.因此,这种逻辑发生的事情似乎是多次登录和重试以及大量额外代码和错误处理的噩梦.

到目前为止我的解决方案是:提出请求.如果我收到未经授权的错误响应,请将请求添加到重试队列(我自己管理),设置登录标志,并发出登录请求.首先进入的任何新请求都会检查登录标志,以查看是否正在进行登录.如果是这样,它们将直接进入重试队列.登录请求完成后,我将通过重试队列并进行所有排队请求.

到目前为止,这似乎工作得很好.但是,我有这种唠叨的感觉,有更好的方法.是否没有内置机制来处理这种情况?这似乎是处理用户身份验证的常用方法,但我找不到任何有关如何在AFNetworking中处理此问题的文档.它们涵盖了Basic和Digest身份验证,但没有关于基于表单的会话cookie身份验证.这是我第一次处理这个问题而且我无法相信没有其他人有这个完全相同的问题.有任何想法吗?

Spo*_*ort 0

一旦用户登录,只要 cookie 在发送下一个请求之前没有过期,您的会话 ID 就应该自动发送。AFNetworking 使用的 NSURLConnection 负责处理 this is a way to save and load cookies 尝试这样

 - (void)saveCookies{

    NSData *savecookiesData = [NSKeyedArchiver archivedDataWithRootObject: [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject: savecookiesData forKey: @"sessionCookies"];
    [defaults synchronize];

}

- (void)loadCookies{

    NSArray *loadcookiesarray = [NSKeyedUnarchiver unarchiveObjectWithData: [[NSUserDefaults standardUserDefaults] objectForKey: @"sessionCookies"]];
    NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];

    for (NSHTTPCookie *cookies in loadcookiesarray){
        [cookieStorage setCookie: cookies];
    }

}
Run Code Online (Sandbox Code Playgroud)