2012-11-19 33 views
6

我最近開始使用Facebook SDK 3.1,並遇到一些使用openActiveSessionWithReadPermissions登錄的問題。openActiveSessionWithReadPermissions不會自動登錄

實際上,登錄功能完美無缺,如果有緩存的令牌可用,它將登錄而不會呈現Facebook用戶界面,如果沒有,則會顯示用戶界面。

我撥打電話reauthorizeWithPublishPermissions後出現問題。如果我撥打reauthorizeWithPublishPermissions,然後關閉並重新打開該應用程序,並致電openActiveSessionWithReadPermissions,它會顯示Facebook用戶界面,並要求用戶說「是的,我擁有讀取權限」,即使存在可用的緩存令牌。

如果我打電話給reauthorizeWithPublishPermissions,它只會錯誤地顯示Facebook UI,否則一切正常。

開放讀碼:

[FBSession openActiveSessionWithReadPermissions:readpermissions allowLoginUI:YES 
             completionHandler:^(FBSession *aSession, FBSessionState status, NSError *error) { 
      [self sessionStateChanged:[FBSession activeSession] state:status error:error]; 
      if (status != FBSessionStateOpenTokenExtended) { 
       // and here we make sure to update our UX according to the new session state 
       FBRequest *me = [[FBRequest alloc] initWithSession:aSession 
                 graphPath:@"me"]; 
       [me startWithCompletionHandler:^(FBRequestConnection *connection, 
               NSDictionary<FBGraphUser> *aUser, 
               NSError *error) { 
        self.user = aUser; 

        aCompletionBlock(aSession, status, error); 
       }]; 
      } 
     }]; 

的sessionStateChanged功能:

- (void)sessionStateChanged:(FBSession *)aSession state:(FBSessionState)state error:(NSError *)error { 

    if (aSession.isOpen) { 
     // Initiate a Facebook instance and properties 
     if (nil == self.facebook || state == FBSessionStateOpenTokenExtended) { 
      self.facebook = [[Facebook alloc] 
          initWithAppId:FBSession.activeSession.appID 
          andDelegate:nil]; 

      // Store the Facebook session information 
      self.facebook.accessToken = FBSession.activeSession.accessToken; 
      self.facebook.expirationDate = FBSession.activeSession.expirationDate; 
     } 
    } else { 
     // Clear out the Facebook instance 
     if (state == FBSessionStateClosedLoginFailed) { 
      [FBSession.activeSession closeAndClearTokenInformation]; 
     } 
     self.facebook = nil; 
    } 
} 

發佈號召,用空aPublishAction來進行測試:

- (void)doPublishAction:(void(^)(FBSession *aSession, NSError *error))aPublishAction { 

    if ([FBSession.activeSession.permissions 
     indexOfObject:@"publish_actions"] == NSNotFound) { 

     NSArray *writepermissions = [[NSArray alloc] initWithObjects: 
            @"publish_stream", 
            @"publish_actions", 
            nil]; 

     [[FBSession activeSession]reauthorizeWithPublishPermissions:writepermissions defaultAudience:FBSessionDefaultAudienceFriends completionHandler:^(FBSession *aSession, NSError *error){ 
      if (error) { 
       NSLog(@"Error on public permissions: %@", error); 
      } 
      else { 
       aPublishAction(aSession, error); 
      } 


     }]; 

    } 
    else { 
     // If permissions present, publish the story 
     aPublishAction(FBSession.activeSession, nil); 
    } 
} 

感謝事先做好準備,我會感謝任何和所有的幫助!

+0

我認爲publish_actions是你所需要的。我認爲它現在包含publish_stream。 – SAHM

+0

你有沒有找到這個解決方案?我有完全相同的問題。 – Casey

+0

從來沒有找到解決方案,我們實際上停止了需要發佈權限,所以我們從不需要找到解決方案。 –

回答

6

您需要

[FBSession.activeSession handleDidBecomeActive];

添加到您的-(void) applicationDidBecomeActive:(UIApplication *)application方法在應用程序的委託作爲migration指導說明。

+0

我確實有這樣的行集,函數看起來像這樣: ' - (void)applicationDidBecomeActive:(UIApplication *)application { {FBSession.activeSession handleDidBecomeActive]; }' 澄清,當我終止並重新打開應用程序時,問題發生。 –

+0

你好。所以,就我所知,在會話已經打開的時候,是否有機會再次調用'[FBsession openActiveSessionWithReadPermissions:allowLoginUI:completionHandler:]'?如果發生這種情況,默認行爲是關閉會話並嘗試再次打開它,這將解釋問題。 – ale0xB

+0

我可以確認這是沒有機會的。正如我所說的,只有在前一個應用程序會話中調用'reauthorizeWithPublishPermissions'時纔會出現此問題。這導致我相信這是導致問題的原因。 –

-2

如果使用openActiveSessionWithPermissions而不是openActiveSessionWithReadPermissions,該怎麼辦?

+0

這就是我最初的,它完美的工作。但據我所知,這是Facebook SDK 3.0的折舊方法,並且要切換到Facebook SDK 3.1的新系統,必須單獨請求讀寫權限,使用'openActiveSessionWithReadPermissions'請求讀取,'reauthorizeWithPublishPermissions '請求寫入。正是在這個新系統上,我遇到了麻煩。 –

+1

openActiveSessionWithPermissions已棄用。 – gran33