iOSparsingFacebooklogin错误308 FBSDKLoginBadChallengeString

我试图在我的iOS应用程序中使用Parse实现Facebooklogin。

let permissionsArray = ["public_profile", "email"] PFFacebookUtils.logInInBackgroundWithReadPermissions(permissionsArray) { (user: PFUser?, error: NSError?) in if let user = user { //we logged in! } else { //login error! } } 

这在模拟器中运行良好,但不在设备上。 在设备上,我得到这个错误:

错误域= com.facebook.sdk.login代码= 308“操作无法完成(com.facebook.sdk.login错误308.)

错误代码308用于FBSDKLoginBadChallengeString ,“login响应缺less有效的挑战string”。

当我在Facebook上授权我的应用程序后,这被称为:

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

url是:

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.eyJhbGdvcml&access_token=CAAXUOnbG6uEBANtAd9DzWBSu4LLOEcPsu86Ny0Ir

是的,我遵循了Parse的Facebooklogin指南中的所有内容(确保所有的包ID匹配,实现了所有必需的AppDelegate方法等)。

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

一个简单的解决scheme为我工作。 在function中启用钥匙串共享

启用钥匙串共享

我已经遵循从totvos和它为我工作的解决方法以及使用FBSDKLoginKit 4.7.1&FBSDKCoreKit 4.8:

解决方法…将应用程序构build并复制到手机,然后从设备(不是debugging器)启动应用程序。 然后,将debugging器附加到正在运行的进程。 这似乎得到解决任何时间问题打破这一点,各种钥匙串操作似乎在debugging时正常工作。

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


更新:

此解决方法并不是一直工作,所以我最终使用@ coco的答案上面: https : //stackoverflow.com/a/31480026/877225

显然唯一的解决scheme是为我添加钥匙串共享权利的目标。

你可以在Project_name-> target_name-> Capabilities-> Keychain Sharing中find它

我升级到时发​​现这个问题:

 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来支持这三者吗?

我仅在注销时才看到此错误,然后重新login。

我的login和注销代码位于不同的文件中,因为login和注销的相关UI完全不同,我已经实例化了两个独立的FBSDKLoginManager实例。 巩固到只有一个实例解决了我的问题。

修复。 这个问题是由使用Parse FBSDKLoginButtonlogin造成的。

以下是我正在做的事情:

 //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尝试login用户! 没有必要也使用PFFacebookUtils.logInInBackgroundWithReadPermissionslogin用户。 所以我刚刚摆脱了fbButtonTouched() ,我可以愉快地login。

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

如果你想知道为什么,这是因为它收到的loginvalidation质询与它所期待的loginvalidation质询不一致,因为它从第二次login尝试发送一次login尝试之后收到第一次login尝试的loginvalidation质询。等待第二次login尝试的身份validation挑战。

FBSDKLoginButton的文档目前没有提及点击它启动loginstream的事实,因为它是UIButton的一个子类,所以你应该认为你应该添加addTarget并自己实现loginstream。 同时有两个login会导致误导FBSDKLoginBadChallengeString 。 食谱为灾难…

编辑:文档已经相应更新:

FBSDKLoginButton[FBSDKAccessToken currentAccessToken]来确定显示内容, 并在点击时自动开始authentication(即,您不需要手动订阅操作目标)

(我的重点)

尝试直接从您的设备运行您的应用程序,而无需从您的Xcode启动它。 然后login到Facebook的W / O烦扰308。之后,你可以恢复从Xcode启动到您的设备W / O相同的问题。

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

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

我在用着

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

…并且在同一会话期间注销并login时出现code 308问题。 在调用logInWithReadPermissions:之前使用[[FBSDKLoginManager alloc] logOut][facebookLoginManager logOut] (使用持久pipe理器) logInWithReadPermissions:不起作用,但添加

 [FBSDKAccessToken setCurrentAccessToken:nil]; [FBSDKProfile setCurrentProfile:nil]; 

logInWithReadPermissions:调用之前工作正常。 (在iOS 9.2中testing)

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

当我将Facebook iOS SDK从版本4.0.1FacebookSDKs-iOS-20150402 )升级到新版本( 4.2.0FacebookSDKs-iOS-201505284.3.0FacebookSDKs-iOS-20150625 )时,这些错误开始出现。 。

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

作为一个方面说明:SDK的新版本似乎与6月初在SO上出现的308个错误post很相关。

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

如果退出并重新login而不离开这个应用程序,这个错误也来了,

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

我使用PFFVideosUtils 1.9.0和FBSDKLoginKit 4.7.0发生后注销和login(无需重新启动应用程序)解决scheme – 目标c:只需添加[[PFFacebookUtils facebookLoginManager] logOut]; 之前[PFFacebookUtils logInInBackgroundWithReadPermissions

按照以下步骤解决这种错误:

  1. 去你的项目
  2. 点击function
  3. 启用钥匙串访问

来自Facebook的官方回应:

我们已经在另一个错误报告中跟踪了这个问题,这在苹果方面似乎是一个错误。

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

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

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

你不必为此降级。

执行以下的事情,它应该工作: – 清理你的派生数据(Xcode – >首选项 – >位置 – >点击派生数据旁边的小箭头)。 确保在执行此操作之前阅读有关派生数据。 如果你有一个复杂的项目,犯了一些愚蠢的错误(例如:删除一些文件),你可能需要找出问题,然后重新运行你的应用程序。 但这不会那么困难。 – 从您的设备/模拟器删除您的应用程序 – 从Facebook删除您的Facebook应用程序批准(设置 – >应用程序 – >点击“x”删除您的应用程序)

重新运行应用程序,一切都应该工作。

祝你好运!

错误代码308是FBSDKLoginBadChallengeString

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

我认为它必须与iOS9的Safarilogin,但不是100%确定

我使用以下方法修复它:1.在AppDelegate中添加Bolts.framework 2.#import

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

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

对此有几个解决方法:1.尝试在没有debugging模式下login,一旦成功,您也可以使用debugging模式进一步成功login。 2.检查错误代码FBSDKLoginBadChallengeString,并调用[FBSDKAccessToken setCurrentAccessToken:nil]清除令牌并重新login。

当我试图捕获login和注销事件如下时,我也遇到了同样的问题

 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"); } }]; } 

但是这只适用于自定义loginbutton,如果您使用的是默认的fbloginbutton,则FBSDKLoginManager已经被初始化,您将在尝试创build另一个button时出错。

因此,为了捕获login和注销事件,只需设置loginbutton的代理,然后像下面这样处理它:

  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]; }