无法在 Xcode Swift Facebook 登录 SDK 中获取访问令牌

Posted

技术标签:

【中文标题】无法在 Xcode Swift Facebook 登录 SDK 中获取访问令牌【英文标题】:Can't get access token in Xcode Swift Facebook login SDK 【发布时间】:2017-06-02 16:01:41 【问题描述】:

我正在尝试在我的应用中测试 Facebook SDK 登录,但一直收到此错误。我看到一个对话框,它接受我的电子邮件和密码登录,然后告诉我我已经接受了该应用程序。我应该看到一条消息“已登录,但我只看到下面的错误。如何在 Xcode ios 模拟器中测试 Facebook SDK。我在 iPhone 上进行了测试,并带有显示访问令牌的警报但得到了相同的结果。它将始终显示“用户取消登录”。

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

这是我的代码。

func signInWithFacebook(button: UIButton) 

    let loginManager = LoginManager()

    loginManager.logIn([ .publicProfile ], viewController: self)  loginResult in

        switch loginResult 

        case .failed(let error):

            let alertController: UIAlertController = UIAlertController(title: "Login error", message: error as? String, preferredStyle: .alert)

            let okAction: UIAlertAction = UIAlertAction(title: "OK", style: .default)  action -> Void in 

            alertController.addAction(okAction)

            self.present(alertController, animated: true, completion: nil)

            print(error)

        case .cancelled:

            let alertController: UIAlertController = UIAlertController(title: "Login cancelled", message: "User cancelled login", preferredStyle: .alert)

            let okAction: UIAlertAction = UIAlertAction(title: "OK", style: .default)  action -> Void in 

            alertController.addAction(okAction)

            self.present(alertController, animated: true, completion: nil)

            print("User cancelled login.")

        case .success(let grantedPermissions, let declinedPermissions, let accessToken):

            print(grantedPermissions)

            print(declinedPermissions)

            print(accessToken)

            let alertController: UIAlertController = UIAlertController(title: "Login success", message: String(describing: accessToken), preferredStyle: .alert)

            let okAction: UIAlertAction = UIAlertAction(title: "OK", style: .default)  action -> Void in 

            alertController.addAction(okAction)

            self.present(alertController, animated: true, completion: nil)

            print("Logged in")
        
    

在第一次通过时,我看到了 Facebook 登录对话框,但此后我只看到一个对话框,说我已经通过 OK 按钮授权了我的应用程序。

let accessToken = AccessToken.current

在 viewDidLoad() 中总是返回 nil。我需要获取一个 accessToken,以便将其发送到 API 并测试响应。

【问题讨论】:

你在吗? 是的,我在这里。 你想访问用户信息吗? 我不需要用户信息,但我确实需要登录 .success 设置的令牌和其他变量。我想将令牌发送到 API 以便在那里登录。 验证时是否有访问令牌? 【参考方案1】:

mb 只用于 fb 登录,最好使用FacebookLogin

这里的令牌:

FBSDKAccessToken.current().tokenString

【讨论】:

其实let token = accessToken.authenticationToken 嗯。有趣,但在我的一个项目中,我看到:` func loginButtonDidCompleteLogin(_ loginButton: LoginButton, result: LoginResult) switch result case .failed(let error): print(error) case .cancelled: print("Cancelled") case .success(let grantPermissions, let deniedPermissions, let accessToken): print("Logged In", FBSDKAccessToken.current().tokenString) ... ` 及其作品! :)【参考方案2】:

我需要在我的 AppDelegate.swift 中添加这个函数。它似乎完全没有记录。

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool 

        return FBSDKApplicationDelegate.sharedInstance().application(application,
                                                                     open: url,
                                                                     sourceApplication: sourceApplication,
                                                                     annotation: annotation)

【讨论】:

【参考方案3】:

如果您已经在 Info.plist 中将 CFBundleURLSchemes 添加到 LSApplicationQueriesSchemes。

如果您尝试解决“canOpenURL:失败”警告,则只有 表明您的设备上未安装 Facebook 应用程序或 模拟器,可以忽略。

【讨论】:

如何在模拟器上安装 facebook 应用程序? 你不需要安装你只需要在模拟器中忽略这个警告。 可以安装应用吗?我需要获取访问令牌并将其发送到 API,然后测试响应。 尝试在模拟器中验证您的应用。您将获得带有此警告的访问令牌。 @markhorrocks 我认为您已经获得了访问令牌!这就是您能够登录的原因。是的,正如 KKRocks 所说,请忽略此消息。一切正常!【参考方案4】:

我认为错误状态 10814 与 cantOpenUrl 相关,当 Facebook 使用参数 fbauth2:/ 调用 URL 时会使用它。喜欢建议的here。打印发生在这个函数内部,所以你不能用它做很多事情

您也可以在设置中进行更改:

目标 > 功能 > 启用钥匙串共享

没关系,因为您是在模拟器中进行测试,而您在真机中进行测试时不会出现。

【讨论】:

我需要在模拟器上进行测试,因为我需要将 facebook 访问令牌发送到 api 以便在那里登录。

以上是关于无法在 Xcode Swift Facebook 登录 SDK 中获取访问令牌的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Swift 在 Xcode 中使用 Parse 1.7.2 和 Facebook SDK 4.1 创建新用户

swift xcode 8 出现大量调试区域错误

Xcode 6 中的 Parse 和 Facebook SDK 导入冲突(无法识别“ParseFacebookUtils”)

在 Xcode 6.3 (Swift) 中使用 Parse 和 Facebook 框架编译错误

使用 URL 显示 Facebook 用户图片 (Swift 5 | Xcode 10)

Facebook 使用 Parse SDK 登录(iOS 9、Xcode 7.1、Swift 2.1)