2012-11-12 66 views
1

在我的iPhone應用程序中,我正在使用AFNetworking向PHP API發出HTTP請求。關閉應用程序後會刪除HTTP會話(iPhone應用程序)

每當我打開應用程序,我必須登錄,服務器將啓動會話。 我登錄後,每次向API發出HTTP請求時,API都知道我有會話,並允許我使用API​​的每個函數。

問題是,我關閉應用程序後,我認爲會話被銷燬,我不能使用API​​的任何功能,而無需再次登錄。

我在說這裏的iPhone應用程序,它使用AFNetworking發出HTTP請求。 從我的測試中我知道會話在應用程序關閉後被銷燬。

我想知道這是否屬實,我想知道製作認證系統的最佳方式是什麼。我認爲該會議不再是解決方案,因爲它們在應用程序關閉後被銷燬。我的選擇是每次有人登錄並將該令牌存儲在應用程序中時創建一個auth_token,然後每次有人打開該應用程序的第一個http請求時,他們將使其包含auth_token,並且該令牌與來自數據庫的令牌匹配,然後像往常一樣初始化會話。我認爲這可能會慢一些,因爲每次打開應用程序時,都必須發出HTTPS請求來初始化客戶端和服務器之間的連接。

所以問題是:您是否確實可以在關閉應用程序後保持會話存活?這是我的替代品嗎?

回答

1

這是我的問題的解決方案。 如果您正在使用AFNetworking,關閉應用程序後將刪除Cookie。因此,要解決這個問題,您可以將Cookie保存爲用戶默認值,然後在應用程序打開時加載它們。

保存的cookies(你應該先檢查一下cookie的名字,我的是PHPSESSID,因爲你不希望保存無用餅乾):當您加載應用程序的「應用程序

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]; 
    } 
0
NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL: networkServerAddress]; 
for (NSHTTPCookie *cookie in cookies) 
{ 
    [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie]; 
}