Swift Facebook 集成登录回调问题

Swift Facebook integration login callback issues

我正在尝试为我的 swift3 应用程序集成 Facebook login

我正在阅读此文档 Facebook SDK for Swift

安装后pod

pod 'FacebookLogin'
pod 'FacebookShare'

并将它们添加到 Linked framework and libraries 中,facebook 登录的工作方式与显示 safari window 以使用 facebook 登录并重定向相同的 ViewController.

但是,我有两个具体问题。 第一个,我需要在 facebook 登录重定向(成功或错误)后添加一个回调并分配当前令牌。

我当前的代码是:

import FacebookLogin
import FacebookCore

class LoginViewController: UIViewController {

    override func viewDidLoad(){
        super.viewDidLoad()
        self.navigationItem.setHidesBackButton(true, animated:true);
        var fbtoken = AccessToken.current

        LoginManager().logOut()

        if(fbtoken != nil){
            let connection = GraphRequestConnection()
            connection.add(GraphRequest(graphPath: "/me")) { httpResponse, result in
                switch result {
                case .success(let response):
                    print("Graph Request Succeeded: \(response)")
                case .failed(let error):
                    print("Graph Request Failed: \(error)")
                }
            }
            connection.start()
        }

        let loginButton = LoginButton(readPermissions: [ .publicProfile ])

        let screenSize:CGRect = UIScreen.main.bounds
        let screenHeight = screenSize.height
        let newCenterY = screenHeight - loginButton.frame.height - 10
        let newCenter = CGPoint(x: view.center.x, y: newCenterY)
        loginButton.center = newCenter

        view.addSubview(loginButton)
}

fbtoken 变量始终为 nil,读取 Login Behavior documentation 无法分配 callback

我做错了什么?

以下可能导致访问令牌为零

  1. 您没有正确设置 info.plist:您必须使用 NSAppTransportSecurity 下的键 NSAllowsArbitraryLoads 将布尔值设置为 YES字典

  2. Facebook SDK 未在您的 AppDelegate 文件的 didFinishLaunchingWithOptions 中正确初始化:您必须进行此调用:

    FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
    
  3. 您的 SDK 版本不是最新的。据报道,某些版本在这方面存在错误,因此如果为您解决了前 2 点,更新 SDK 可能会解决您的问题

为了回答您的其他问题,Facebook SDK 有一个 login 方法,其闭包参数如下

let manager = FBSDKLoginManager()

manager.logIn(withReadPermissions: ["public_profile"], from: self, handler: { (result, error) in
      if error != nil {
         // handle error
      }

      // login successful

})

注意:我提供的代码使用 pod 'FBSDKLoginKit'pod 'FBSDKShareKit',因此可能存在细微的语法差异,但最终它们的工作方式相同。

编辑

我刚刚注意到您正在使用 Facebook 的 LoginButton。在这种情况下,请参阅文档的 this 页面以获取更多信息。主要是,您可以执行以下操作:

确保您符合FBSDKLoginButtonDelegate并实现didCompleteWithResult方法,其中包含登录操作的结果。我链接的页面包含该方法的参数和您可能需要的其他详细信息。