iOS Parse Facebook登录错误308 FBSDKLoginBadChallengeString

时间:2015-06-04 11:51:59

标签: ios facebook parse-platform

我正在尝试使用Parse在我的iOS应用中实现Facebook登录。

let permissionsArray = ["public_profile", "email"]

PFFacebookUtils.logInInBackgroundWithReadPermissions(permissionsArray)
    { (user: PFUser?, error: NSError?) in

    if let user = user {
        //we logged in!
    }
    else {
        //login error!
    }
}

这在模拟器中很有效,但在设备上却不行。在设备上,我收到此错误:

  

错误Domain = com.facebook.sdk.login Code = 308"操作无法完成。 (com.facebook.sdk.login错误308。)

错误代码308适用于FBSDKLoginBadChallengeString,"登录响应缺少有效的质询字符串。"

我在Facebook上授权我的应用程序后,会调用它:

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {
    return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
}

网址是:

fb1640722449492705://authorize/#state=%7B%22challenge%22%3A%225OKWv3wN%2BEH%2BeQu48Xv6ty%2BRuek%3D%22%2C%22com.facebook.sdk_client_state%22%3Atrue%2C%223_method%22%3A1%2C%220_auth_logger_id%22%3A%22564CD915-2CFC-4989-9AF6-CEA389908D51%22%7D&granted_scopes=user_birthday%2Cpublic_profile&denied_scopes=&signed_request=c8SBBDeaNpF-R_XTYx4LRA0BWm5p9IwXDr8M4nL3YXI.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImNvZGUiOiJBUURhTXJibGw4Q3dITkd5M0xnQmNkVTNuYWRkeEVoTU5mMmx3eFpZU2IwZl9SU284YXhZdXZaRS02RnA2bU5Cdy1CWkVoRmt2Zk1xX1AxSHltUG00aWhkWE9hYmlvWFBiMnpCYkVnR1RRX3lzZVFIZXdHU19OcmpkNUF6WGtob1dfVE4wTmRrSGk5MzY0V2hFWUJDV0dfcE16RXpQVExHWE13X1dzb0QzZGtITm5fM0tHNjFxUjJyM3RDWVlNQTE4WENpS1dXTHUyM2dIRVhmTXc3ZTQ0M2xDQUtGRl9KSXcyVk1sS01FOTQ4dHQ2U1Fqb0tlVkp4RmJNSEFsWDZFYWxlUnQ2aGRrTGZlU2xuVTV5VjZ1bFhldHkxeEV5RmRDZVFHb2RXQ0dULVVCd3QyM0haY0dxNk8zbnE1cDRNWjNFZ012U2JhSGZyMmF6Wm8xUXk2X2xSQVNWcFlMVDZUdU5wZnMwVkJqNEdSaFEiLCJpc3N1ZWRfYXQiOjE0MzM0MTg2MDksInVzZXJfaWQiOiIxNDM3MzM0ODk5OTIwNDA5In0&access_token=CAAXUOnbG6uEBANtAd9DzWBSu4LLOEcPsu86Ny0Ir

是的,我跟踪了Parse's Facebook login guide中的所有内容(确保所有捆绑ID都匹配,实现了所有必需的AppDelegate方法等)。

这个错误究竟是什么意思,你如何解决它?

21 个答案:

答案 0 :(得分:49)

一个简单的解决方案适合我。只需在功能中启用钥匙串共享

Enable Keychain Sharing

答案 1 :(得分:15)

我退出时只看到此错误,然后重新登录。

我的登录和注销代码位于不同的文件中,因为登录和注销的相关UI完全不同,我已经实例化了两个单独的FBSDKLoginManager实例。仅合并到一个实例就解决了我的问题。

答案 2 :(得分:15)

显然,对我有用的唯一解决方案是为目标添加Keychain Sharing Entitlement。

您可以在Project_name-> target_name->功能 - > Keychain Sharing

中找到它

答案 3 :(得分:15)

我使用了totvos的解决方法,并且在使用FBSDKLoginKit 4.7.1& FBSDKCoreKit 4.8:

  

解决方法...将应用构建并复制到手机,然后启动   来自设备的应用程序(不是调试器)。然后,附加调试器   到了运行过程。这似乎可以解决任何时间问题   打破了这一点,各种钥匙串操作似乎都有效   在调试时正确。

参考:https://forums.developer.apple.com/thread/4743#85335

更新

这种解决方法并不是一直有效,所以我最终使用@ coco的答案:https://stackoverflow.com/a/31480026/877225

答案 4 :(得分:14)

我升级到以下时发现了这个问题:

FBSDKCoreKit 4.4.0
FBSDKLoginKit 4.4.0
FBSDKShareKit 4.4.0.

当我降级为:

时,它就消失了
FBSDKCoreKit 4.2.0
FBSDKLoginKit 4.1.0
FBSDKShareKit 4.1.0

我没有机会发现升级在什么时候导致这种情况 - 例如,我是否可以坚持使用4.3.0这三种?

答案 5 :(得分:11)

修正了它。此问题是由使用Parse 使用FBSDKLoginButton登录而导致的。

这就是我在做的事情:

//in my UI setup code:
let fbLoginButton = FBSDKLoginButton()
fbLoginButton.addTarget(self, action: "fbButtonTouched:", forControlEvents: UIControlEvents.TouchUpInside)

....

func fbButtonTouched() {
    let permissionsArray = ["public_profile", "email"]

    PFFacebookUtils.logInInBackgroundWithReadPermissions(permissionsArray)
        { (user: PFUser?, error: NSError?) in

            if let user = user {
                //we logged in!
            }
            else {
                //login error!
            }
    }
}

我发现<艰难的方式点击 FBSDKLoginButton尝试登录用户!也无需使用PFFacebookUtils.logInInBackgroundWithReadPermissions登录用户。所以我摆脱了fbButtonTouched(),我可以愉快地登录。

所以发生的事情是我在同一时间尝试两次登录,模拟器很满意,但不是设备。

如果您想知道原因,那是因为它收到了did not correspond to the one it was expecting的登录身份验证质询,因为它在尝试从第二个日志中发送了一个之后从第一个登录尝试中收到了一个,因此正在等待对于第二次登录尝试的身份验证挑战。

The documentation for FBSDKLoginButton目前没有提及任何关于点击它启动登录流程的事实,因为它是UIButton的子类,你会认为你应该addTarget来自己实现登录流程。同时进行两次登录会导致误导FBSDKLoginBadChallengeString。灾难食谱......

编辑:文档已相应更新:

  

FBSDKLoginButton[FBSDKAccessToken currentAccessToken]配合使用以确定要显示的内容,并在点按时自动启动身份验证(即,您无需手动订阅操作目标)

(我的重点)

答案 6 :(得分:8)

尝试直接从您的设备运行您的应用,而无需从Xcode启动它。然后登录到Facebook没有受到308的困扰。之后,您可以继续从Xcode启动到您的设备没有相同的问题。

这似乎是FB SDK和iOS之间的问题,与Parse无关。如果有人能在这个问题上给我们启发,我会很感激。

我的Xcode版本是7.1,FB SDK是4.8.x。

答案 7 :(得分:7)

我正在使用

pod 'FBSDKCoreKit', '~> 4.8.0'
pod 'FBSDKLoginKit', '~> 4.8.0'
pod 'FBSDKShareKit', '~> 4.8.0'

...当我退出并在同一会话期间登录时出现code 308问题。在调用[[FBSDKLoginManager alloc] logOut]之前使用[facebookLoginManager logOut]logInWithReadPermissions:(使用持久管理员)不起作用,但添加

[FBSDKAccessToken setCurrentAccessToken:nil];
[FBSDKProfile setCurrentProfile:nil];
logInWithReadPermissions:来电之前

正常。 (在iOS 9.2中测试过。)

答案 8 :(得分:4)

我也有错误308,但是我没有使用Parse SDK。

当我将Facebook iOS SDK从版本4.0.1FacebookSDKs-iOS-20150402)升级到其中一个较新版本(4.2.0 - FacebookSDKs-iOS-20150528或{{1>时,这些错误就开始出现了} - 4.3.0)。

降级Facebook iOS SDK to version 4.0.1为我解决了这个问题。

作为旁注:SDK的新版本似乎与6月初SO上308个错误帖子的出现相关。

答案 9 :(得分:4)

在降级之前,我会尝试清除本地缓存。在Facebook帐户之间切换时,我遇到了这个问题。删除你的应用程序,强制Facebook退出,然后重新运行所有内容,看看它是否仍然存在。可能存在Facebook传递不再有效的旧缓存密钥的错误。降级可能是清除缓存或旧版本没有错误。

答案 10 :(得分:4)

  

如果注销并再次登录而不离开此应用程序,此错误也是如此   来,

let deletepermission = FBSDKGraphRequest(graphPath: "me/permissions/", parameters: nil, HTTPMethod: "DELETE")
            deletepermission.startWithCompletionHandler({(connection,result,error)-> Void in
                println("the delete permission is \(result)")
                dispatch_async(dispatch_get_main_queue(), { () -> Void in
                    FBSDKAccessToken.setCurrentAccessToken(nil)
                    FBSDKProfile.setCurrentProfile(nil)
                    fbLoginManager.logOut()
                    AppDelegate.sharedAppDelegte().logout()
                })
            })

答案 11 :(得分:3)

请按照以下步骤解决此类错误:

  1. 转到您的项目
  2. 点击功能
  3. 启用钥匙串访问

答案 12 :(得分:3)

我正在使用PFFacebookUtils 1.9.0和FBSDKLoginKit 4.7.0 注销和登录后发生在我身上(没有重新启动应用程序) 解决方案 - 目标c: 只需添加[[PFFacebookUtils facebookLoginManager] logOut];[PFFacebookUtils logInInBackgroundWithReadPermissions之前

答案 13 :(得分:2)

使用相同的FBSDKLoginManager实例直到注销,然后创建一个新实例。

[fbLoginManager logOut];
fbLoginManager = [[FBSDKLoginManager alloc] init];

答案 14 :(得分:2)

Facebook的官方回应:

  

我们已经在另一个错误报告中跟踪此问题了   在Apple方面是一个错误。

https://developers.facebook.com/bugs/919990934704584/

答案 15 :(得分:1)

你不必为此降级。

执行以下操作,它应该有效: - 清理派生数据(Xcode - &gt;首选项 - &gt;位置 - &gt;单击派生数据旁边的小箭头)。确保在执行此操作之前阅读有关派生数据的信息。如果你有一个复杂的项目,并犯了一些愚蠢的错误(例如:删除了一些文件),你可能需要在重新运行你的应用程序之前弄清楚问题。但它不会那么困难。 - 从您的设备/模拟器中删除您的应用程序 - 从Facebook删除您的Facebook应用程序批准(设置 - &gt;应用程序 - &gt;点击&#34; x&#34;删除您的应用程序)

重新运行应用程序,一切都应该有效。

祝你好运!

答案 16 :(得分:0)

我修复它: 1.添加Bolts.framework 2.in AppDelegate:#import

答案 17 :(得分:0)

将Facebook SDK更新到最新版本解决了这个问题。

答案 18 :(得分:0)

由于authenticationChallenge问题,当您错误地尝试同时登录两次,然后进一步登录会在调试时在控制台上给您一些钥匙串警告,当您在设备上进行调试时,此错误将会很明显。没有调试模式你就不会得到这个错误,原因是当你没有调试时,keychain会正常工作。

这方面的解决方法很少: 1.尝试在没有调试模式的情况下登录,一旦成功,您也可以使用调试模式进一步成功登录。 2.检查错误代码 FBSDKLoginBadChallengeString 并调用[FBSDKAccessToken setCurrentAccessToken:nil]清除令牌并再次执行登录。

答案 19 :(得分:0)

当我尝试捕获登录和注销事件时,我遇到了同样的问题,如下所示

loginButton = [[FBSDKLoginButton alloc] init];
// Handle clicks on the button
[loginButton
 addTarget:self
 action:@selector(loginButtonClicked) forControlEvents:UIControlEventTouchUpInside];

// Once the button is clicked, show the login dialog
-(void)loginButtonClicked
{
  FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
  [login
    logInWithReadPermissions: @[@"public_profile"]
          fromViewController:self
                     handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
    if (error) { 
      NSLog(@"Process error");
    } else if (result.isCancelled) {
      NSLog(@"Cancelled");
    } else {
      NSLog(@"Logged in");
    }
  }];
}

但这只适用于自定义登录按钮,如果您使用默认的fb登录按钮,FBSDKLoginManager已经初始化,您将在尝试创建另一个时收到错误。

因此,为了捕获登录和注销事件,只需设置登录按钮的委托,然后像下面那样处理它:

    loginButton = [[FBSDKLoginButton alloc] init];
    loginButton.delegate = self;


- (void)loginButton:(FBSDKLoginButton *)loginButton didCompleteWithResult:(FBSDKLoginManagerLoginResult *)result error:(NSError *)error {
    if (!error) {
        [self getFBProfile];
    }
}

- (void)loginButtonDidLogOut:(FBSDKLoginButton *)loginButton {
    [self logout];
}

答案 20 :(得分:0)

错误代码308是FBSDKLoginBadChallengeString

使用FBSDKLoginManager的共享实例解决了这个问题。我创建了一个单例,确保只有一个FBSDKLoginManager被实例化。

我认为它与iOS9 Safari登录有关,但不是100%确定