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 和 FBSDKLoginButton
login造成的。
以下是我正在做的事情:
//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.logInInBackgroundWithReadPermissions
login用户。 所以我刚刚摆脱了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.1
( FacebookSDKs-iOS-20150402
)升级到新版本( 4.2.0
– FacebookSDKs-iOS-20150528
或4.3.0
– FacebookSDKs-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
按照以下步骤解决这种错误:
- 去你的项目
- 点击function
- 启用钥匙串访问
来自Facebook的官方回应:
我们已经在另一个错误报告中跟踪了这个问题,这在苹果方面似乎是一个错误。
使用相同的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]; }
- 无法为FacebookSDK 4构build模块“FBSDKCoreKit”
- 无法findcom.facebook.katana.provider.AttributionIdProvider的提供者信息
- Facebook的post链接图片
- Facebook页面访问令牌 – 这些过期吗?
- Facebooklogin消息:“URL阻止:此redirect失败,因为redirectURI未在应用程序的”客户端OAuth设置“中列入白名单。
- Facebook user_id:big_int,int或string?
- FacebookSdk.sdkInitialize(上下文)已被弃用
- 如何添加一个Facebook“赞”button到一个AJAX驱动页面
- Android发布图片到Facebook墙上