2017-08-12 123 views
0

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

但与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年8月12日14:14:33.223472-0700项目[2423:10***终止应用程序由于未捕获的异常'NSInternalInconsistencyException',原因是:

***第一掷调用堆栈 '你必须到+ initializeFacebookWithApplicationLaunchOptions调用初始化PFFacebookUtils': (0x188042fe0 0x186aa4538 0x188042f28 0x100b8f934 0x100b90020 0x100b9032c 0x10019eee8 0x1001a0a64 0x100867598 0X 10086e998 0x10086e4f0 0x100871a94 0x18b3610d4 0x101521a10 0x101526b78 0x187ff10c8 0x187feece4 0x187f1eda4 0x189989074 0x18e1dd364 0x1001ec288 0x186f2d59c) 的libC++ abi.dylib:与类型的未捕获的异常终止NSException (LLDB)

+0

您可以在应用程序崩溃后发布日志输出吗? 'PFFropicalUtils.logInInBackground'起作用,所以必须有另一个问题。 – nathan

+0

好吧,我刚刚编辑错误的帖子。 – fphelp

+0

我的意思是控制台输出(作为文本,而不是图像)。这只是Xcode中的一个异常断点。 – nathan

回答

0

如文档中所述,您需要初始化PFFacebookUtils使用它,像这样前:

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

    // CODE... 

    PFFacebookUtils.initializeFacebook(applicationLaunchOptions: launchOptions) 
} 

重要:必须解析设置Parse.initialize...)之后进行。

+0

哇,现在它的工作! **当用户想要用他们的账户获取这些东西时,我需要保存些什么?**例如,如果用户注册了正常的方式,我只需使用他们保存的用户名。 – fphelp

+0

没什么。 Parse用户表中的用户行由“PFFVideosUtils”创建。 'PFFropicalUtils.logInInBackground'处理第一次用户(注册)或现有用户(登录)。 – nathan

+0

现在我明白了解析它在我的用户类中添加了一个新行!但是他们会自动用随机字符串填充用户名列,名称和电子邮件字符串为空。我已经从他们的Facebook帐户中提取用户名和电子邮件,所以**我如何在首次注册时自动将这些列放入这些列中?另外,如何检查用户是否第一次登录,以便他们可以更改Facebook分配的随机用户名?** – fphelp