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

Kat*_*ger 24 single-sign-on facebook-ios-sdk ios6

我正在使用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];
                                     }];
Run Code Online (Sandbox Code Playgroud)

如果然后每次获得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;
}
Run Code Online (Sandbox Code Playgroud)

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

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}
Run Code Online (Sandbox Code Playgroud)

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

ill*_*ors 38

另一个答案提供了一种手动将设备与服务器重新同步的方法.我定义了一个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){

        }
    }];
}
Run Code Online (Sandbox Code Playgroud)

}

然后我调用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];
 }];
Run Code Online (Sandbox Code Playgroud)

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

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

  • 可能更好的将底部代码块包装到一个名为`fbAttemptConnection`之类的函数中,然后使用`[self performSelector:@selector(fbAttemptConnection)withObject:nil afterDelay:0.5]`而不是使用`sleepForTimeInterval:`并阻塞线程. (8认同)

Pie*_*ard 12

我有同样的问题.检查您的FB应用程序是否在设置 - > Facebook中启用.我被禁用(即使我不记得禁用它),一旦我启用它,它就被修复了.

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