如何在 iOS 10 上使用 Facebook iOS SDK

Posted

技术标签:

【中文标题】如何在 iOS 10 上使用 Facebook iOS SDK【英文标题】:How to use Facebook iOS SDK on iOS 10 【发布时间】:2016-12-05 23:45:26 【问题描述】:

我正在尝试使用 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)")

有人有解决办法吗?

注1:

经过调试,这个问题是FBSDK无法更新expect_challangesecurity.framework 内的函数 SecItemUpdate 不起作用。这是IOS 10的问题

【问题讨论】:

"...您为什么希望它能够工作?"因为软件应该可以工作。这不是这个人的错,也不是 Facebook 的错。这是苹果的错。他们获得通过是因为这是“测试版”,但打破钥匙串几乎是不可接受的,即使在测试版中也是如此。 【参考方案1】:

错误 OSStatus -10814 发生在canOpenURL: can't find any application 时,可以打开此 URL(实际上,Facebook 试图通过使用参数“fbauth2:/”调用 canOpenURL: 来查找他们的应用程序) .打印发生在函数内部,因此您无能为力。 但是,如果您将在安装了 Facebook 应用程序的设备上运行您的应用程序,您将不会看到此错误。

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

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

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

只要确保您在权利和权利中启用钥匙串访问 也选择模拟器(调试)构建的权利。默认 未设置。

【讨论】:

非常感谢,您有关于此更改的任何文件吗? 退出xcode后,运行sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer,并尝试重建,仍然遇到同样的问题。我现在意识到我看到的错误与***.com/questions/39091841/… 更相似 @NikitaP 您似乎对@RoyKolak 上面提到的问题有经验。 @NikitaP 想通了。这是一个试图自动集成到应用程序委托中的第三方库 (CleverTap)。我回复了***.com/questions/39091841/…感谢您的关注! @RomanErmolov 我想通了,我在 Xamarin 上,在构建调试时,默认情况下不使用 Entitlement.plist 文件。当我包含调试权利时,它起作用了。以下为我提供了正确解决方案的最后推动力。 ***.com/a/39576798/1062572 - 也许你可以更新你的答案,让 Xamarin 兄弟们更容易弄清楚他们是否失踪了。【参考方案2】:

同样的问题出现在我的应用程序中,我检查了许多解决方案,但对我不起作用。我已经用下面的方法解决了这个问题。

转到此Link 选择您的应用并配置您的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)

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

在未安装fb应用时应该打开web ui。【参考方案4】:

在我的情况下,修复是*:

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 推荐的那样

【讨论】:

【参考方案5】:

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

作为旁注,其他用户提到如果您没有在模拟器上安装 Facebook,则会出现此错误。确实如此,但 SDK 应该在未安装应用程序时自动回退到 Web 登录方法。如果这没有发生,则可能是由其他问题引起的,例如 Info.plist 中缺少/错误配置的值(检查 LSApplicationQueriesSchemes)或 AppDelegate 上缺少方法。

【讨论】:

【参考方案6】:

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

【讨论】:

以上是关于如何在 iOS 10 上使用 Facebook iOS SDK的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 中以 pageadmin 身份在 Facebook 页面上发布状态提要?

使用 SWIFT 在 iOS SDK for Facebook 上使用 FBSDKGraphRequest

如何在 iOS 6 上将多个 URL 共享到 Facebook

在 iOS 6 上 Facebook 登录失败

如何使用 SLRequest 在 iOS 6 中集成 Facebook?

IOS 8 如何在 Facebook、Twitter 社区页面上发布消息、图像