Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Facebook登录与Parse Swift 3集成_Swift_Facebook_Parse Platform_Swift3 - Fatal编程技术网

将Facebook登录与Parse Swift 3集成

将Facebook登录与Parse Swift 3集成,swift,facebook,parse-platform,swift3,Swift,Facebook,Parse Platform,Swift3,在我的Xcode项目中,我已经有了一个使用用户创建的用户名和密码的登录功能。现在我想在项目中集成Facebook登录,但我不完全确定如何做到这一点。当有人通过我现在拥有的方式创建帐户时,他们会创建并保存一个用户名和密码,然后可以与PFUser.logIn(使用用户名:…,密码:…)一起使用,以便在任何时候再次登录 但对于Facebook,我不知道我应该用什么唯一标识符来保存他们的帐户。我知道我可以提取一个Facebook id,但在我得到这个id后,我如何登录用户?正如我之前所说,我目前使用PF

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

但对于Facebook,我不知道我应该用什么唯一标识符来保存他们的帐户。我知道我可以提取一个Facebook id,但在我得到这个id后,我如何登录用户?正如我之前所说,我目前使用
PFUser.logIn(用户名:…,密码:…)
登录用户,然后我只使用
PFUser.current()?.username
获取与该用户相关的所有数据。我听说我打算为此使用
PFFacebookUtils.logininbackbackground
,但我已经尝试过实现它,但当我按下“继续使用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]***由于未捕获的异常“NSinternalinconsistenceexception”而终止应用程序,原因是:“您必须通过调用+initializeFacebookWithApplicationLaunchOptions来初始化PFFacebookUtils”

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


如文档中所述,在使用它之前,您需要初始化
PFFacebookUtils
,如下所示:

func application(_ application: UIApplication,
                 didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {

    // CODE...

    PFFacebookUtils.initializeFacebook(applicationLaunchOptions: launchOptions)
}

重要提示:必须在解析设置后完成。
Parse.initialize…
)。

一旦应用程序崩溃,您可以发布日志输出吗
PFFacebookUtils.logInInBackground
有效,因此肯定还有另一个问题。好的,我刚刚编辑了带有错误的帖子。我指的是控制台输出(作为文本,而不是图像)。这只是Xcode中的一个异常断点。好的,我已经更改了它。哇,现在它工作了!当用户想要从他们的帐户中获取信息时,我应该在parse中保存什么?例如,如果用户以正常方式注册,我只使用他们保存的用户名。无。Parse的用户表中的用户行由
PFFacebookUtils
创建
PFFacebookUtils.logInInBackground
处理第一次用户(注册)或现有用户(登录)。啊,现在我看到在parse中,它在我的用户类中添加了一个新行!但是他们会自动用一个随机的文本字符串填充用户名列,而名称和电子邮件字符串是空的。我已经从他们的Facebook帐户中提取了用户名和电子邮件,那么当他们第一次注册时,我该如何自动将它们放在这些列中呢?另外,我如何检查用户是否是第一次登录,以便他们可以更改Facebook分配的随机用户名?为什么要更改用户名?用户名仅对用户密码登录有用,而不是Fb。查看旧帖子以检查它是新用户还是现有用户。您可以在注册后设置用户的所有详细信息。其他用户将能够看到当前用户的用户名,因此他们需要能够将用户名更改为自己喜欢的用户名。更改Facebook提供给他们的用户名会导致任何错误吗?