2012-05-18 48 views
6

我在另一個項目上使用了Facebook Connect,但是在我目前的項目中,似乎當我撥打[facebook logout];時,它並沒有刪除用戶的詳細信息。如果我再重新啓動應用程序,我在didFinishLaunchingWithOptions功能如下:iOS - Facebook連接註銷不刪除登錄細節?

facebook = [[Facebook alloc] initWithAppId:@"XXXXXXXXXXXXX" andDelegate:self]; 
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

if([defaults objectForKey:@"FBAccessTokenKey"] 
    && [defaults objectForKey:@"FBExpirationDateKey"]){ 
    facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"]; 
    facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"]; 

} 

    NSLog(@"startup login"); 
    [self loginToFacebook];//attempt to login automatically on startup 

我loginToFacebook功能是這樣的:

- (void)loginToFacebook 
{ 
    NSLog(@"Logging into facebook"); 
    //set up facebook and login in automatically if possible 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

    if([defaults objectForKey:@"FBAccessTokenKey"] 
     && [defaults objectForKey:@"FBExpirationDateKey"]){ 
     facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"]; 
     facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"]; 

    } 

    if (![facebook isSessionValid]){ 

     //get permissions that user will need to agree to us using 
     NSArray *permissions = [[NSArray alloc] initWithObjects: 
           @"user_likes",@"read_friendlists",@"offline_access", @"publish_stream", 
          nil]; 
     //authorise our login 
     [facebook authorize:permissions]; 
     [permissions release]; 
    } 
    else 
    { 
     [facebook authorize:nil]; 
    } 
} 

就我而言,這個時候我應該會提示用我的電子郵件和密碼登錄。 我主要使用模擬器使Facebook的應用程序本身不是原因,並在Facebook.h類我已經改變了

[self authorizeWithFBAppAuth:NO safariAuth:YES]; 

[self authorizeWithFBAppAuth:NO safariAuth:NO]; 

但是什麼情況是,Facebook的窗口短暫地閃爍並消失,正如我預期的那樣,當我已經登錄時,它會從我之前的登錄詳細信息中加載我的ID,姓名,朋友列表等。我不能再改變用戶了!我要補充一點,我有以下的代碼,因此打印在「註銷」:

- (void)fbDidLogout{ 
    NSLog(@"Logged out of facebook"); 
} 

...它打印到控制檯時,[Facebook的註銷]被調用。我也有正確的網址方案,所以這裏沒有問題。

正如我所說我已經在另一個應用程序的工作,但我看不出我可以忽略這一次。 我歡迎任何建議,因爲我懷疑這簡直太荒唐了。

編輯:我剛剛在設備上進行了測試,嘗試登錄到Facebook導致應用程序崩潰。我懷疑這是因爲它試圖使用「存儲」信息登錄,因爲我尚未登錄設備,所以信息不存在。我仍在調查,但如果有的話,如果有任何可以看到明顯的缺陷,我會非常感激。

編輯2:我試過用safecase的例子刪除cookie。期間)didFinishLaunchingWithOptions和b)fbDidLogout期間我還打印出所有的餅乾,而我得到如下:

一) `2012-05-18 10:40:40.665 MyApp的[15545:17003( 「」

"<NSHTTPCookie version:0 name:\"c_user\" value:\"634361620\" expiresDate:2012-06-17 09:34:33 +0000 created:2012-05-18 09:34:34 +0000 (3.59026e+08) sessionOnly:FALSE domain:\".facebook.com\" path:\"/\" isSecure:TRUE>", 
"<NSHTTPCookie version:0 name:\"csm\" value:\"2\" expiresDate:2012-06-17 09:34:33 +0000 created:2012-05-18 09:34:34 +0000 (3.59026e+08) sessionOnly:FALSE domain:\".facebook.com\" path:\"/\" isSecure:FALSE>", 
"<NSHTTPCookie version:0 name:\"datr\" value:\"gxe2T8ZyBzMGb5w3LS29Q0kJ\" expiresDate:2014-05-18 09:34:33 +0000 created:2012-05-18 09:34:34 +0000 (3.59026e+08) sessionOnly:FALSE domain:\".facebook.com\" path:\"/\" isSecure:FALSE>", 
"<NSHTTPCookie version:0 name:\"locale\" value:\"en_US\" expiresDate:2012-05-25 09:36:43 +0000 created:2012-05-18 09:36:44 +0000 (3.59027e+08) sessionOnly:FALSE domain:\".facebook.com\" path:\"/\" isSecure:FALSE>", 
"<NSHTTPCookie version:0 name:\"lu\" value:\"RgayA7CMIlsAl-lOD2-Y-O3g\" expiresDate:2014-05-18 09:34:33 +0000 created:2012-05-18 09:34:34 +0000 (3.59026e+08) sessionOnly:FALSE domain:\".facebook.com\" path:\"/\" isSecure:FALSE>", 
"<NSHTTPCookie version:0 name:\"m_user\" value:\"0%3A0%3A0%3A0%3Av_1%2Cajax_1%2Cwidth_320%2Cpxr_1%2Cgps_1%3A1337333673%3A2\" expiresDate:2012-08-16 09:34:33 +0000 created:2012-05-18 09:34:34 +0000 (3.59026e+08) sessionOnly:FALSE domain:\".facebook.com\" path:\"/\" isSecure:FALSE>", 
"<NSHTTPCookie version:0 name:\"s\" value:\"Aa4WdKU-oOFathmK\" expiresDate:2012-06-17 09:34:33 +0000 created:2012-05-18 09:34:34 +0000 (3.59026e+08) sessionOnly:FALSE domain:\".facebook.com\" path:\"/\" isSecure:TRUE>", 
"<NSHTTPCookie version:0 name:\"xs\" value:\"125%3AFFIWXjAXDXUMmw%3A2%3A1337333673\" expiresDate:2012-06-17 09:34:33 +0000 created:2012-05-18 09:34:34 +0000 (3.59026e+08) sessionOnly:FALSE domain:\".facebook.com\" path:\"/\" isSecure:TRUE>" 

)`

b) 2012-05-18 10:41:16.530 MyApp[15545:17003] ( )

由於它變爲空,我會假設它們將被刪除。但重新打開應用程序時,他們都在那裏。

編輯3:解決這個問題的唯一方法是在應用程序打開時立即刪除所有的cookies,但這意味着用戶每次都必須登錄,即使他們自己上次登錄時也是如此應用已打開。這是暫時的修復,我仍然不確定它爲什麼不能按原樣工作。

回答

19

您提供當用戶點擊註銷此方法,並刪除存儲在userdefault所有按鍵爲Facebook

- (void)fbDidLogout 
{ 
    NSLog(@"Logged out of facebook"); 
    NSHTTPCookie *cookie; 
    NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 
    for (cookie in [storage cookies]) 
    { 
     NSString* domainName = [cookie domain]; 
     NSRange domainRange = [domainName rangeOfString:@"facebook"]; 
     if(domainRange.length > 0) 
     { 
      [storage deleteCookie:cookie]; 
     } 
    } 
} 
+0

根本沒有什麼區別,我很害怕。 facebook類已經在它的invalidateSession函數中包含了cookie的移除,這在[facebook註銷]中被調用。我仍然嘗試將代碼明確地添加到我的fbDidLogout函數中,但問題仍然存在。 – TheBestBigAl

+0

將此代碼添加到我的代碼的開頭,因此每次啓動時都會擦除登錄詳細信息。不理想,但它現在起作用。 – TheBestBigAl

+0

太棒了!對我來說就像魔術一樣 –

1

注意:在使用的名稱,以及FB應用程序商店中NSUserDefaults登錄信息,它還保存了登錄信息在NSHTTPCookieStoragem_user。您可以刪除此記錄,以使FB再次詢問您的登錄信息。

希望這些信息對您有所幫助。

+0

好,所以我已經嘗試使用NSLog(@「%@」,[[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]);'檢查哪裏有cookie,並且足夠正確的m_user顯示爲其中之一。我不明白的是,facebook類應該刪除這些,並根據safecase的建議,我嘗試在註銷時手動刪除它們。由於某種原因,它一次只能運行一次,但是我每隔一次註銷並重新啓動它都會保留cookie。 – TheBestBigAl

+0

已更新問題以顯示Cookie發生了什麼情況。 – TheBestBigAl

+0

我記得我在這個API中修復了一些源代碼。請檢查註銷方法是否真的向服務器發送註銷消息。 – SVGreg

0

[appDelegate.session closeAndClearTokenInformation];

就是那行代碼,幫我清理了我的代幣。

0
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"FBAccessTokenKey"]; 

[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"FBExpirationDateKey"];