1

在我的 iPhone 应用程序中,我使用 AFNetworking 向 PHP API 发出 HTTP 请求。

每次打开应用程序时,我都必须登录,服务器将启动会话。登录后,每次我向 API 发出 HTTP 请求时,API 都知道我有会话,并允许我使用 API 的每个功能。

问题是,在我关闭应用程序后,我认为会话已被破坏,我无法使用 API 中的任何功能而无需再次登录。

我在这里谈论一个使用 AFNetworking 发出 HTTP 请求的 iPhone 应用程序。从我的测试中,我知道会话在应用程序关闭后被破坏。

我想知道这是否属实,并且我想知道制作身份验证系统的最佳方法是什么。我认为该会话不再是解决方案,因为它们在应用程序关闭后被销毁。我的替代方法是每次有人登录时创建一个 auth_token 并将令牌存储在应用程序中,然后每次有人打开应用程序时,他们将发出的第一个 http 请求将包含 auth_token 并且如果该令牌与数据库中的令牌匹配,然后像往常一样初始化会话。我认为这可能会慢一些,前提是每次打开应用程序时都必须发出 HTTPS 请求来初始化客户端和服务器之间的连接。

所以问题是:关闭应用程序后是否可以保持会话处于活动状态?它是我的替代品吗?

4

2 回答 2

1

这是我的问题的解决方案。如果您使用 AFNetworking,则在您关闭应用程序后会删除 cookie。因此,要解决此问题,您可以将 cookie 保存在用户默认值中,然后在应用程序打开时加载它们。

保存 cookie(你应该先检查 cookie 的名称,我的是 PHPSESSID,因为你不想保存无用的 cookie):

    NSArray * all = [NSHTTPCookie cookiesWithResponseHeaderFields:[self.response allHeaderFields] forURL:[NSURL URLWithString:@"http://link.to.api" ]];
    for (NSHTTPCookie *cookie in all)
    {
        if([cookie.name compare:@"PHPSESSID"] == NSOrderedSame)
        {
            NSData *data = [NSKeyedArchiver archivedDataWithRootObject:cookie];
            [[NSUserDefaults standardUserDefaults] setObject:data forKey:@"MySavedCookies"];
            [[NSUserDefaults standardUserDefaults] synchronize];
        }
    }

然后,当您在“应用程序 didFinishLaunchingWithOptions”中加载应用程序时,例如:

  NSData *cookiesdata = [[NSUserDefaults standardUserDefaults] objectForKey:@"MySavedCookies"];
  if([cookiesdata length])
  {
     NSHTTPCookie *cookie = [NSKeyedUnarchiver unarchiveObjectWithData:cookiesdata];
    [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
  }
于 2013-01-27T11:18:38.977 回答
0
NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL: networkServerAddress];
for (NSHTTPCookie *cookie in cookies) 
{
    [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
}
于 2013-01-12T15:04:58.953 回答