FBSDK登录错误代码: 308 在Objective-C中

57

我一直收到以下错误信息:

"Error Domain=com.facebook.sdk.login Code=308 "The operation couldn’t be completed. (com.facebook.sdk.login error 308.)""

当我尝试从我的设备登录 Facebook 时。

我的代码在模拟器上运行正常,但在实际设备上却不行。有人遇到过这个错误代码吗?如果需要,我很乐意分享代码。


代码肯定是必要的,你的问题中没有足够的信息来给出任何建议。顺便说一句,我做了一个快速搜索,找到了这个网址https://dev59.com/pF0a5IYBdhLWcg3wJl6o。不确定是否与您的问题相同,但我想检查一下也无妨。 - curveorzos
你看过这个吗?https://dev59.com/pF0a5IYBdhLWcg3wJl6o#31480026 - coco
相同的错误出现在 Xcode 7.1、iOS 9.1 和 FB SDK 4.7.1 上。 - jonypz
1
这是对我有效的解决方法:https://dev59.com/pF0a5IYBdhLWcg3wJl6o#33683799 - ObjSal
我刚刚用最新的FB SDK框架替换了我的旧框架,现在可以正常工作了! - Anurag Sharma
18个回答

48
以下解决方案适用于在Xcode 8上运行的iOS9+,Swift3.0。步骤如下:
  1. 设置Facebook启动

FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)

  1. 设置打开网址

    guard let source = options[UIApplicationOpenURLOptionsSourceApplicationKey] as? String else { return false } let annotation = options[UIApplicationOpenURLOptionsAnnotationKey] as? String return FBSDKApplicationDelegate.sharedInstance().application(application, open: url, sourceApplication: source, annotation: annotation)

  2. 修复如下图所示的钥匙串权限问题

iOS 9 Keychain fix


实际上在XCode 8 GM和iOS 10 GM模拟器上对我有用。谢谢! - Dmitry Kurilo
3
谢谢!打开钥匙串共享功能后,问题得到了解决。 - Feta
我不知道具体发生了什么。打开钥匙串共享似乎起作用了,但在我关闭它后,它仍然继续工作。 - theMoonlitKnight
你在哪里写“设置打开网址”? - kavehmb
在我的Mac App Store上的Xcode 8中,打开钥匙串共享对我来说起作用了,而且在iOS 10模拟器上也是如此。谢谢! - andrewcar

44

对我来说,至少有一个解决方案,那就是不通过Xcode调试器在设备上运行。如果我在调试器外在设备上运行应用程序,则Facebook登录正常工作。如果我通过调试器在模拟器中运行应用程序,则Facebook登录也正常工作。

只有当我通过Xcode调试器在设备上运行应用程序时,每次都会出现"com.facebook.sdk.login error 308"。


1
这个不起作用 - 你可以从断开调试器的设备上运行,并且从 FB 注销并尝试登录可能会触发此场景。使用 FB SDK 4.6.0 运行。 - Shaun
谢谢。在没有使用Xcode调试器的情况下在设备上运行应用程序后,我也能够进行调试。 - kalpesh jetani
截至20160223,使用iOS 9.2上的Facebook iOS SDK 4.10.0仍然会发生这种情况。 - chubao

42

您应该在能力标签页上启用钥匙串共享


这对我有用,但稍微解释一下可能会帮助其他人:)不过还是谢谢! - greenhouse

27

我曾经也遇到了完全相同的问题,通过修改Info.plist文件找到了解决方案。

我已经将所有可能的scheme添加到LSApplicationQueriesSchemes中。

完整的列表如下:

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>fbapi</string>
    <string>fbapi20130214</string>
    <string>fbapi20130410</string>
    <string>fbapi20130702</string>
    <string>fbapi20131010</string>
    <string>fbapi20131219</string>
    <string>fbapi20140410</string>
    <string>fbapi20140116</string>
    <string>fbapi20150313</string>
    <string>fbapi20150629</string>
    <string>fbauth</string>
    <string>fbauth2</string>
    <string>fb</string>
    <string>fb-messenger-api20140430</string>
    <string>fb-messenger-platform-20150128</string>
    <string>fb-messenger-platform-20150218</string>
    <string>fb-messenger-platform-20150305</string>
    <string>fb-messenger-api</string>
    <string>fbshareextension</string>
</array>

这对我来说似乎也修复了问题。我正在使用SDK 4.7,他们的说明特别指出,在升级到4.6或更高版本后,您不应该需要整个列表。哦,好吧,很高兴它现在能用! - Chad Pavliska
1
实际上,它停止工作了,没有任何明显的原因。 - Andrespch
1
是的,它起初是有效的,但现在我又遇到了同样的错误。有人有SDK 4.7的永久解决方案吗? - ShayanK
当iOS 9.1推出以后,Facebook在内部进行了大量修改以正确处理关联域名的情况。也许,这个答案已经失效了,但是它仍然在我目前正在工作的项目中有效。 - Stas Zhukovskiy
@TheEye,你可能是对的。那个答案在当时是相关的,但是Facebook已经发布了几个版本的SDK,现在已经不是一个问题了。 - Stas Zhukovskiy
显示剩余2条评论

14
我在使用FB SDK 4.6.0、Xcode 7.0和iOS9时遇到了完全相同的问题。我严格按照Facebook开发者网站上的所有设置和说明进行了操作,但以上解决方案都对我没用。我发现,当你正在向设备实时部署并在登录过程中反馈到Xcode控制台时,行为会变得更糟糕。它真的很随机,有时候可以成功登录,有时候又不能。当你在部署后重新启动应用程序时,似乎表现得更加可预测。- 是的,事实确实如此!
如果它决定无法登录,会出现以下错误:
Error Domain=com.facebook.sdk.login Code=308 "(null)"

7
我也是。FBSDK 4.6.0 和 Xcode 7.0 & iOS9。第一次成功登录后,注销后就再也无法登录了。我已尝试卸载并重新安装应用程序,使用不同的 FB 帐户,但都没有成功。同样的二进制文件在 iOS7 和 iOS8 设备上运行良好。 - Dong Ma
这里也是一样,第一次登录很顺利,随后的登录都会出现错误,错误代码为Error Domain=com.facebook.sdk.login Code=308 "(null)"... 上述解决方案都没有起作用。 - sachadso
为了调试应用程序并解决问题,我已经在方案设置中将“启动”设置为“等待可执行文件启动”。没有调试控制台日志,但至少我有断点命中。 - Yevhen Dubinin

5

我的解决方案适用于Xcode7.1,Swift2.0

步骤1:清除您的构建文件夹:option + command + K

或者:选择Product > Clean

输入图像描述

步骤2:清除您的派生数据:选择Window > Projects输入图像描述

然后选择Delete输入图像描述


4

我在FB的代码中进行了一些挖掘,似乎这只是一个权限问题。

FB使用钥匙串来存储登录期间的授权挑战。当返回时,它尝试从钥匙串获取值并失败。有关详细信息,请参见此SO答案

安全性授权可以在配置文件之间更改,正如我们所知道的那样,保持配置文件、构建配置和设备/模拟器的一致性就像牵引猫一样困难。这可能解释了为什么人们会遇到如此不一致的行为。

因此,在生产环境中,一切都应该正常运作,如果在测试过程中出现问题,则需要仔细检查您的配置文件上的授权。


很棒的解决方案,这就是为什么被接受的答案是正确的解释。我对于简单的“不要运行调试器”并不满意,而这个解决方案让我感到放心。干得好!+1 - Unome

4

我曾经遇到过同样的问题,通过刷新系统凭据来解决了这个问题。

[FBSDKLoginManager renewSystemCredentials:^(ACAccountCredentialRenewResult result, NSError *error) {

    [[[YourAuthManager manager] facebookLoginManager] logInWithReadPermissions:@[@"email"] fromViewController:nil handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {

        if (error) {
            // Handle error
        } else if (result.isCancelled) {
            // Handle cancellations
        } else {
            // If you ask for multiple permissions at once, you
            // should check if specific permissions missing
            if ([result.grantedPermissions containsObject:@"email"]) {
                // Do work
            }
        }
    }];
}];

这个解决方案比重新安装要温和,而且可以确保用户不必这样做。 我猜测FBSDK 4.6与iOS 9系统的FB身份验证凭据存在一些冲突。
编辑:经过一段时间的测试,问题仍然存在,虽然不像以前那么频繁,但仍然是一个问题,所以我们降级到了之前的FB SDK版本。希望有人能找到更好的解决方案。

1
在更改捆绑标识符后,这是问题所在 - 刷新系统凭据起作用了。 - Shaun

1
在我的情况下,通过更新到最新的FB SDK(目前为4.10版本)来解决了这个问题。

0

如果您正在使用FBSDK 4.38,则在FBSDKLoginManager.m中解析challengeExpected存在错误。

我找到了rinat-enikeev的热修复方法:

https://github.com/facebook/facebook-sdk-swift/issues/286

https://github.com/facebook/facebook-objc-sdk/pull/922/commits/bcf7f787e92320a6322fb3f6130fdc3815bbafb7

只需要改变

NSString *challengeExpected = [self loadExpectedChallenge];

NSString *challengeExpected = [[self loadExpectedChallenge] stringByReplacingOccurrencesOfString:@"+" withString:@" "];

这对我解决了问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接