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