在设备上切换FB帐户时,iOS 6上的Facebook授权失败

时间:2012-10-11 11:06:55

标签: ios6 single-sign-on facebook-ios-sdk

我正在使用Facebook SDK 3.1.1在我的iOS应用程序中实现FB Connect。这在新的FB集成(在iOS上登录)或通过Web视图回退到正常授权(在两种情况下都没有安装本机Facebook应用程序)的简单情况下工作正常。 我在iOS级别切换帐户时会出现此问题。注销并使用其他FB用户帐户登录。

要登录/授权我执行:

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

如果然后每次获得FBSessionStateClosedLoginFailed,即使我在达到该状态时执行closeAndClearTokenInformation

- (void)sessionStateChanged:(FBSession *)session
                  state:(FBSessionState) state
                  error:(NSError *)error
{
    NSLog(@"Session State Changed: %u", [[FBSession activeSession] state]);
    switch (state) {
        case FBSessionStateOpen:
            break;
        case FBSessionStateClosed:
        case FBSessionStateClosedLoginFailed:
            NSLog(@"FBSessionStateClosedLoginFailed ERROR: %@", [error description]);
            [[FBSession activeSession] closeAndClearTokenInformation];
            break;
        default:
            break;
}

但是,每次重试都会收到相同的状态。我的日志说明如下:

FBSDKLog: FBSession **INVALID** transition from FBSessionStateCreated to FBSessionStateClosed
FBSDKLog: FBSession transition from FBSessionStateCreated to FBSessionStateCreatedOpening 
FBSDKLog: FBSession transition from FBSessionStateCreatedOpening to FBSessionStateClosedLoginFailed Session State Changed: 257
FBSessionStateClosedLoginFailed TOKEN: (null)
FBSessionStateClosedLoginFailed ERROR: Error Domain=com.facebook.sdk Code=2 "The operation couldn’t be completed. (com.facebook.sdk error 2.)" UserInfo=0xb24cc20 {com.facebook.sdk:ErrorLoginFailedReason=com.facebook.sdk:ErrorLoginFailedReason}

任何人都可以复制这个或者知道问题可能在哪里吗?

6 个答案:

答案 0 :(得分:38)

Another answer提供了一种手动将设备与服务器重新同步的方法。我定义了一个名为fbRsync的方法来调用此代码。确保在实现文件中#import <Accounts/Accounts.h>,然后定义此方法:

-(void)fbResync
{
    ACAccountStore *accountStore;
    ACAccountType *accountTypeFB;
    if ((accountStore = [[ACAccountStore alloc] init]) && (accountTypeFB = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook] ) ){

    NSArray *fbAccounts = [accountStore accountsWithAccountType:accountTypeFB];
    id account;
    if (fbAccounts && [fbAccounts count] > 0 && (account = [fbAccounts objectAtIndex:0])){

    [accountStore renewCredentialsForAccount:account completion:^(ACAccountCredentialRenewResult renewResult, NSError *error) {
        //we don't actually need to inspect renewResult or error.
        if (error){

        }
    }];
}

}

如果fbResync产生错误,我会致电openActiveSessionWithReadPermissions

[FBSession openActiveSessionWithReadPermissions:permissions
                                   allowLoginUI:YES
                              completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
     if(error)
     {
         NSLog(@"Session error");
         [self fbResync];
         [NSThread sleepForTimeInterval:0.5];   //half a second
         [FBSession openActiveSessionWithReadPermissions:permissions
                                            allowLoginUI:YES
                                       completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
            [self sessionStateChanged:session state:state error:error];
                                       }];

     }
     else
         [self sessionStateChanged:session state:state error:error];
 }];

半秒钟的延迟可能是不必要的,但它目前给了我一点心思。

这似乎解决了我的问题。我现在可以在Facebook帐户之间切换,并且能够登录.Yay!

答案 1 :(得分:12)

我遇到了同样的问题。检查您的FB应用程序是否已在“设置”中启用 - &gt; Facebook的。 我被禁用(即使我不记得禁用它),一旦我启用它,它就被修复了。

在我的测试过程中,我已经从我的iPhone帐户中添加并删除了我的FB应用程序几次,该帐户与我的iPhone相关联。它可以解释为什么,神奇地,我的应用程序被禁用。

答案 2 :(得分:3)

在ios 6中使用fb sdk 3.1.1。请在“[FBSessio openActiveSessionWithReadPermissions ...”方法中将权限参数传递为“nil或email”。在这里,我的代码很棒。

#define IOS_NEWER_OR_EQUAL_TO_6 ( [ [ [ UIDevice currentDevice ] systemVersion ] floatValue ] >= 6.0 )

-(void)showFBLogin
{
    [FBSession.activeSession closeAndClearTokenInformation];

    NSArray *permissions = [NSArray arrayWithObjects:@"email, publish_actions, publish_stream", nil];

#ifdef IOS_NEWER_OR_EQUAL_TO_6
    permissions = nil; or NSArray *permissions = [NSArray arrayWithObjects:@"email",nil];
#endif

    NSLog(@"\npermissions = %@", permissions);
    [FBSession openActiveSessionWithReadPermissions:permissions
                                       allowLoginUI:YES
                                  completionHandler:
     ^(FBSession *session,
       FBSessionState state, NSError *error) {
         NSLog(@"\nfb sdk error = %@", error);
         switch (state) {
             case FBSessionStateOpen:
                 [[FBRequest requestForMe] startWithCompletionHandler:
                  ^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) {
                      if (!error) {
                          //success
                      } 
                  }];
                 break;
             case FBSessionStateClosed:
                 //need to handle
                 break;
             case FBSessionStateClosedLoginFailed:
                 //need to handle
                 break;
             default:
                 break;
         }
     }];
}

答案 3 :(得分:1)


我在使用iOS7.1的3.1.3 FB SDK上遇到了同样的问题。我在这里找到了解决方案。希望它有所帮助!!
我在这里尝试了所有答案 @loganathan nil权限,@ lill_always_be_a_warriors fbResync。
所有这些都不适合我
但我发现当我在iPhone 7.1模拟器中启动相同的代码时它会很好用 (没有SSO“单点登录”)

相同的代码适用于旧版本的iOS FB SDK(不确定哪个版本,但不是3.13) (但尝试登录时不会显示SSO)

所以,我尝试重新编写示例问题。我在这里找到了几个不同的东西 1. https://developers.facebook.com/docs/ios/getting-started添加新的FacebookDisplayName
2.我修改了用于iTune连接的BundleID,但我没有将它更新回Faceboook App Dev

修改这些设置后,它可以在我的iOS应用程序上使用SSO功能 希望它有所帮助!!

答案 4 :(得分:0)

您是否尝试过RenewSystemCredential方法?看一下这篇文章:

Facebook iOS SDK extendAccessToken not Working - fbDidExtendToken not being called

答案 5 :(得分:0)

我得到了同样的错误。但我使用@ill_always_be_a_warriors方法:-(void)fbResync但不适合我。

我终于发现这是我的权限问题,我删除了offline_access权限,它有效,希望它有所帮助。