将Facebook登录与Parse Swift集成3

时间:2017-08-12 21:03:30

标签: swift facebook parse-platform swift3

在我的Xcode项目中,我已经有一个登录功能,它使用用户创建的用户名和密码。现在我想在项目中集成Facebook登录,但我不完全确定如何做到这一点。当有人通过他们现在的方式创建帐户时,他们会创建并保存用户名和密码,然后只要他们想要再次登录,就可以与PFUser.logIn(withUsername: ..., password: ...)一起使用。

但是对于Facebook,我不知道我想用什么唯一标识符保存他们的帐户。我知道我可以提取一个Facebook ID,但是如何在我得到这个之后登录用户?就像我之前所说的,我之前使用PFUser.logIn(withUsername: ..., password: ...)来记录用户'然后我只使用PFUser.current()?.username来获取与该用户相关的所有数据。我听说我想使用PFFacebookUtils.logInInBackground来做这件事,但我已经尝试过实现它,但是当我按下"继续使用Facebook按钮"时,应用程序崩溃了(我截屏错误并将其放置在底部)。我复制了我迄今为止的代码。 如何将注册功能与Facebook功能集成,以便我保存用户的Facebook ID以及我使用何种方法对用户进行签名(即PFFacebookUtils.logInInBackground)?此处'我的代码到目前为止:

@IBOutlet var facebookSignUpButton: FBSDKLoginButton!
    var fullnameFB = String()
    var idFB = String()
    var emailFB = String()
    var isFBSignUp = Bool()

    override func viewDidLoad() {
        super.viewDidLoad()

        signUpWithFacebook()
    }
    func signUpWithFacebook() {
        facebookSignUpButton.readPermissions = ["email", "public_profile"]
        facebookSignUpButton.delegate = self
        self.view.addSubview(facebookSignUpButton)

    }
func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) {
        if error != nil { //if theres an error
            print(error)
        } else if result.isCancelled { // if user cancels the sign up request
            print("user cancelled login")
        } else {
            PFFacebookUtils.logInInBackground(with: result!.token!) { (user, error) in
                if error == nil {

                if let user = user {

                    if user.isNew {
                        print("User signed up and logged in through Facebook!")
                    } else {
                        print("User logged in through Facebook!")
                    }

                    if result.grantedPermissions.contains("email") {
                        if let graphRequest = FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "email, name"]) {
                            graphRequest.start(completionHandler: { (connection, result, error) in
                                if error != nil {
                                    print(error?.localizedDescription ?? String())
                                } else {
                                    if let userDetails = result as? [String: String]{
                                        print(userDetails)
                                        self.fullnameFB = userDetails["name"]!
                                        self.idFB = userDetails["id"]!
                                        self.emailFB = userDetails["email"]!
                                        self.isFBSignUp = true
                                    }
                                }
                            })
                        }
                    } else {
                        print("didnt get email")
                        self.createAlert(title: "Facebook Sign Up", message: "To signup with Facebook, we need your email address")
                    }

                } else {
                    print("Error while trying to login using Facebook: \(error?.localizedDescription ?? "---")")
                }
                } else {
                    print(error?.localizedDescription ?? String())
                }
            }
        }
    }

控制台输出:

  

2017-08-12 14:14:33.223472-0700项目[2423:1001235] ***由于未捕获的异常终止应用程序' NSInternalInconsistencyException',原因:'您必须初始化PFFacebookUtils调用+ initializeFacebookWithApplicationLaunchOptions'

     

***第一次抛出调用堆栈:   (0x188042fe0 0x186aa4538 0x188042f28 0x100b8f934 0x100b90020 0x100b9032c 0x10019eee8 0x1001a0a64 0x100867598 0x10086e998 0x10086e4f0 0x100871a94 0x18b3610d4 0x101521a10 0x101526b78 0x187ff10c8 0x187feece4 0x187f1eda4 0x189989074 0x18e1dd364 0x1001ec288 0x186f2d59c)   libc ++ abi.dylib:以NSException类型的未捕获异常终止   (lldb)

1 个答案:

答案 0 :(得分:1)

正如文档中所述,您需要在使用之前初始化func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool { // CODE... PFFacebookUtils.initializeFacebook(applicationLaunchOptions: launchOptions) } ,如下所示:

Parse.initialize...

重要提示:必须在解析设置request)之后完成。