2013-01-01 26 views
6

我已將我的應用程序從Facebook SDK 2升級到3.1。Facebook iOS在點擊好後返回到應用程序似乎丟失了會話已確認應用程序

我在RecordsScreen上有一個Post按鈕。如果用戶沒有登錄到Facebook,登錄頁面將會出現,如果用戶已經登錄,則會加載另一個筆尖,以提示用戶輸入信息發佈到他/她自己的牆上。

我已經登錄。之後,每次點擊「發佈」按鈕時,關於應用的頁面都已獲得授權,並詢問您是否繼續單擊「好」出現。點擊好後,該應用程序終止,並從頭開始重新啓動。每當我點擊「發佈」按鈕時,該頁面都會再次出現。它看起來像無法找到有效的會話或令牌丟失。

我已經在模擬器和設備上測試過了。同樣的事情發生。部署目標是iOS5.1。

我沒有輸入的唯一參數是iPhone App Store ID。這會影響上述行爲嗎?

我已經嘗試了很多次,並且找不到解決方案。

任何幫助表示讚賞。

謝謝!

的AOB


編輯於1月4日:

我發現每次openSessionWithAllowLoginUI被調用。返回狀態FBSessionStateClosedLoginFailed。登錄有問題。但是,自從「已授權」頁面出現以後,用戶已登錄。

原因是applicationWillTerminate openSessonWithAllowLoginUI後立即執行。任何人都可以闡明這一點嗎?


在appDelegate.h,我導入FacebookSDK/FacebookSDK.h和在appDelegate.m,實現以下各項:

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { 
return [FBSession.activeSession handleOpenURL:url); 
} 

-(void)applicationDidBecomeActive:(UIApplication *)application { 
[FBSession.activeSession handleDidBecomeActive]; 
} 

-(void)applicationWillTerminate:(UIApplication *)application { 
[FBSession.activeSession close]; 
} 

的mainViewController是多視圖控制器將切換碎粒。

我實現了一個類FBHandler來處理Facebook登錄/註銷。 FBHandler.h包含#進口「Facebook.h」和FBHandler是包含

-(void)sessionStateChanged:(FBSession *)session state:(FBSessionState)state error:(NSError *)error { 
    switch(state) { 
    case FBSessionStateOpen: 
     break; 
    case FBSessionStateClosed: 
    case FBSessionStateClosedLoginFailed: 
     [FBSession.activeSession closeAndClearTokenInformation]; 
    default: 
     break; 
    } 

    [[NSNotificationCenter defaultCenter]postNotificationName:FBSessionStateChangedNotification object:session]; 

    // If there is an error, display the alert view. I have skipped this code. 
} 

-(BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI { 
    return [FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:allowLoginUI completionHandler:^(FBSession *session, FBSessionState state, NSError *error) { 
     [self sessionStateChanged:session state:state error:error]; 
    }]; 
} 

其中碎粒的一類 - RecordsScreen.xib包含Facebook登錄/註銷按鈕。在RecordsScreen.m(一個地方,用戶可以看到他/她的得分,登錄或從Facebook註銷),以下是加入到viewDidLoad中:

fbHandler = [[FBHandler alloc] init]; 
[fbHandler openSessionWithAllowLoginUI:NO]; 

// Also, we will listen to FBSessionStateChangedNotification in viewDidLoad. Code is skipped here. 

// The implementation of sessionStateChanged in RecordsScreen: 
-(void)sessionStateChanged:(NSNotification *)notification { 
    if (FBSession.activeSession.isOpen) { 
     if (self.facebook == nil) { 
      self.facebook = [[Facebook alloc]initWithAppId:FBSession.activeSession.appID andDelegate:nil]; 
      self.facebook.accessToken = FBSession.activeSession.accessToken; 
      self.facebook.expirationDate = FBSession.activeSession.expirationDate; 
     } 
    } else { 
     self.facebook = nil; 
    } 
} 

在RecordsScreen.m,如果用戶點擊登錄在按鈕中,

if (!FBSession.activeSession.isOpen) { 
    // Login to Facebook. 
    [fbHandler openSessionWithAllowLoginUI:YES]; 
} else { 
    // If user is login, post to wall. 
    [self postScoreToWall]; 
} 
+0

這個 – Harikrishnan

+0

沒有必要的應用程序商店標識在Facebook SDK 2中工作正常嗎? – Harikrishnan

+1

是的,它在SDK 2中工作正常。代碼是不同的。 – aobs

回答

4

我發現了這個問題。在plist中,「應用程序不在後臺運行」被設置爲YES。設置爲NO解決了問題。

2

在您顯示的代碼中,您只獲取會話的基本讀取權限集。至少需要致電reauthorizeWithPublishPermissions:傳遞適當的權限。

我只是有一個類似的問題,我通過改變兩件事情,這樣做我不使用Facebook建議兩步許可升級方法登錄時解決它,但我嘗試使用openActiveSessionWithPublishPermissions收購上登錄所需的權限。

在嘗試再次調用sdk之前,還需要確保在Facebook登錄過程結束時調用handleDidBecomeActive:。如果您有一系列執行此過程的各個步驟的塊,則可能不會發生這種情況。

我沒有使用這個sdk的舊版本,但它似乎更直觀。

+0

我將在用戶登錄後使用reauthorizeWithPublishPermissions並點擊發布按鈕。但我會嘗試你的建議,看看它是否能解決問題。 – aobs

+0

剛剛通過權限更改爲openActiveSessionWithPublishPermissions測試了該應用程序。發生同樣的問題。 – aobs

相關問題