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

在设备上切换FB帐户时,在iOS6上Facebook授权失败,ios6,single-sign-on,facebook-ios-sdk,Ios6,Single Sign On,Facebook Ios Sdk,我正在使用Facebook SDK 3.1.1在iOS应用程序中实现FB Connect。在简单的情况下,无论是新的FB集成(在iOS上登录)还是通过web view恢复到正常授权(我没有在这两种情况下安装本机Facebook应用程序),这都可以正常工作。 当我在iOS级别上切换帐户时出现问题。使用不同的FB用户帐户注销和登录 要登录/授权,请执行以下操作: [FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:allo

我正在使用Facebook SDK 3.1.1在iOS应用程序中实现FB Connect。在简单的情况下,无论是新的FB集成(在iOS上登录)还是通过web view恢复到正常授权(我没有在这两种情况下安装本机Facebook应用程序),这都可以正常工作。 当我在iOS级别上切换帐户时出现问题。使用不同的FB用户帐户注销和登录

要登录/授权,请执行以下操作:

[FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:allowLoginUI
                                     completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
                                         [self sessionStateChanged:session state:state error:error];
                                     }];
如果每次获取FBSessionStateClosedLogin失败,即使我在达到该状态时执行了
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}
任何人都可以重现这一点,或者知道问题可能出在哪里吗?

提供了一种手动将设备与服务器重新同步的方法。我定义了一个名为
fbRsync
的方法来调用此代码。确保在实现文件中导入,然后定义此方法:

-(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){

        }
    }];
}
}

然后,如果
openActiveSessionWithReadPermissions
产生错误,我调用
fbResync

[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帐户之间切换,并且可以登录。耶

在ios 6中使用fb sdk 3.1.1。请在“[FBSession 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;
         }
     }];
}
#定义IOS更新的或等于6([[[UIDevice currentDevice]systemVersion]floatValue]>=6.0)
-(void)showFBLogin
{
[FBSession.activeSession closeAndClearTokenInformation];
NSArray*权限=[NSArray arrayWithObjects:@“电子邮件、发布操作、发布流”,无];
#如果定义IOS较新或等于6
permissions=nil;或NSArray*permissions=[NSArray arrayWithObjects:@“email”,nil];
#恩迪夫
NSLog(@“\n权限=%@”,权限);
[FBSession openActiveSessionWithReadPermissions:权限
阿洛洛洛吉努伊:是的
completionHandler:
^(第*届会议,
FBSessionState状态,N错误*错误){
NSLog(@“\nfb sdk错误=%@”,错误);
开关(状态){
案例FBSessionStateOpen:
[[FBRequest requestForMe]startWithCompletionHandler:
^(FBRequestConnection*连接,NSDictionary*用户,NSError*错误){
如果(!错误){
//成功
} 
}];
打破
案件审理结束:
//需要处理
打破
案例FBSessionStateClosedLogin失败:
//需要处理
打破
违约:
打破
}
}];
}

我也遇到了同样的问题。请检查您的FB应用程序是否已在设置->Facebook中启用。 我的被禁用了(尽管我不记得禁用了),一旦我启用了它,它就被修复了


在我的测试过程中,我已经多次从我的FB帐户中添加和删除我的FB应用程序,该帐户与我的iPhone相链接。这可能会神奇地解释为什么我的应用程序被禁用。

你尝试了RenewSystemCredential方法吗?请看这篇文章:


我也遇到了同样的错误。但是我使用了@ill\u always\u be\u a\u warriors方法:
-(void)fbResync
,但对我不起作用

我终于发现这是我的权限问题,我删除了
脱机访问权限
权限,它可以工作,希望它能帮助一些人。


我在iOS7.1的3.1.3 FB SDK上也遇到了同样的问题。我在这里找到了解决方案。希望能有所帮助!!
我在这里尝试了所有答案。
@loganathan无权限,@ill\u always\u be\u a\u fbResync.
所有这些都不适合我。

但我发现,当我在iPhone 7.1模拟器中启动相同的代码时,它会很好地工作
(无SSO“单点登录”)

同样的代码在旧版本iOS FB SDK上运行良好(不确定是哪个版本,但不是3.13)
(但尝试登录时不会显示SSO)

因此,我尝试重新编写一个示例问题。我在这里发现了几个不同的问题。
1.添加新的FacebookDisplayName
2.我修改了iTunes connect的BundleID,但没有将其更新回Faceboook应用程序开发


修改这些设置后,它将在具有SSO功能的iOS应用程序上运行。

希望能有帮助!!

我想我和你有同样的问题。我还不知道任何解决方案或解决办法。你是如何打开FBSDKLog日志记录的?我在这里找到了这个方法:
[FBSettings setLoggingBehavior:[NSSet setWithObjects:FBLoggingBehaviorFBRequests,FBLoggingBehaviorFBURLConnections,FBLoggingBehaviorAccessTokens,FBLoggingBehaviorSessionStateTransforms,nil]]
BTW,现在似乎对我有效,尽管我不知道为什么。我已经将问题的解决方案合并到我的sessionStateChanged处理程序中,但它仍然无法工作。直到我稍后重试。出于某种原因,现在的行为如下所示。我在iOS上切换当前正在工作的FB用户,在应用程序中会话是打开的,但是请求将失败。下次尝试时,将打开一个具有正确令牌的新会话,对FB的下一个请求将生效。最好将底部代码块封装到一个名为
fbAttemptConnection
的函数中,然后使用
[自执行选择器:@selector(fbAttemptConnection)with object:nil afterDelay:0.5]
而不是使用
sleepForTimeInterval:
并阻塞线程。此外,这将与iOS 5不向后兼容。出于某种原因,
fbAccounts
为我返回一个空数组,即使在iOS 6上也是如此。与其使用任何延迟,不如创建一个完成块,以便fbResync在内部调用
([accountStore续订Account:Account的凭证