如何在 iOS 10 上使用 Facebook iOS SDK

How to use Facebook iOS SDK on iOS 10

我正在尝试使用 Xcode 8 使用 Swift 3 构建一个带有 Facebook 登录的应用程序。当我切换回 iOS Simulator 9.3 时,它可以工作。在 iOS 10 中,我收到此错误:

""fbauth2:/" The operation couldn’t be completed. (OSStatus error -10814.)"

Optional(Error Domain=com.facebook.sdk.login Code=308 "(null)")

有人对此有解决方案吗?

注一:

经调试,此问题为FBSDK无法更新expect_challangesecurity.framework 中的函数 SecItemUpdate 无效。这是IOS10

的问题

错误 OSStatus -10814canOpenURL: can't find any application 时发生,可以打开此 URL(实际上,Facebook 试图找到他们的应用程序通过使用参数 "fbauth2:/" 调用 canOpenURL:)。打印发生在函数内部,所以你不能用它做任何事情。 但是,如果您 运行 在安装了 Facebook 应用程序的设备上使用您的应用程序,您将不会看到此错误。

错误 308 发生的原因是,当存储在钥匙串中的值不等于存储在 facebook 完成参数中的值时(有关更多信息,您可以查看 -[FBSDKLoginManager completeAuthentication:expectChallenge:]).

这是因为 Apple 在 iOS10 中更改了使用钥匙串的方式。要解决此问题,您只需转到 Targets->Capabilities 并启用钥匙串共享(它可以为您的应用程序访问钥匙串) ):

如果您正在使用 Xamarin(阅读此 了解更多信息,感谢@dynamokaj):

Just make sure you enable the keychain access in Entitlements and select the entitlements for Simulator (Debug) builds too. By default this is not set.

就我而言,问题是 Google 分析。默认情况下,它似乎在应用程序的视图控制器之上添加了自己的视图控制器。 在 {Your app}-Info.plist 中将 "FirebaseAppDelegateProxyEnabled" 设置为 "NO" 解决了问题。

您收到以下错误的主要原因,

canOpenURL: failed for URL: "fbauth2:/" - error: "The operation couldn’t be completed. (OSStatus error -10814.)

是您的iOS模拟器没有安装Facebook应用程序。在您将应用程序安装到 iOS 模拟器之前,您将继续收到错误消息。在安装了 Facebook 的已配置 iOS 设备上尝试 运行 您的 iOS 应用程序,您将不会再看到错误消息。希望这对您有所帮助!

同样的问题出现在我的应用程序中,我检查了很多解决方案但都不适合我。我已经使用以下方法解决了这个问题。

转到此 Link Select 您的应用程序并配置您的 info.plist

import 并将此代码添加到您的 AppDelegate

import FBSDKCoreKit
import FBSDKLoginKit

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    return FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
}

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    return FBSDKApplicationDelegate.sharedInstance().application(app, open: url, options: options)
}

就我而言,修复是*:

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { 

  // First, handle Facebook URL open request
  if let fbSDKAppId = FBSDKSettings.appID(), url.scheme!.hasPrefix("fb\(fbSDKAppId)"), url.host == "authorize" { 
    let shouldOpen: Bool = FBSDKApplicationDelegate.sharedInstance().application(app, open: url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String!, annotation: options[UIApplicationOpenURLOptionsKey.annotation]) 
    return shouldOpen 
  } 

  // After it, handle any other response (e.g. deep links)
  handlerOtherUrls(url: url) 
  return true 
}

*@MoridinBG 在 Facebook SDK's Github page

推荐

如果您使用的是 FBSDKCoreKit 或 FBSDKLoginKit 版本 4.39.0,也可能导致此错误。此版本的 SDK 中存在错误。升级到 4.39.1 或更高版本以修复它。详情 here.

附带说明一下,其他用户提到如果您没有在模拟器上安装 Facebook,就会看到此错误。没错,但 SDK 应该会在未安装应用程序时自动回退到 Web 登录方式。如果这没有发生,则可能是由其他问题引起的,例如 Info.plist 中的 missing/misconfigured 值(检查 LSApplicationQueriesSchemes)或 AppDelegate 中缺少方法。