目前,我允许用户“使用Facebook登录”:
@objc func handleFBLogin() {
FBSDKLoginManager().logIn(withReadPermissions: ["email", "public_profile"], from: self) { (result, error) in
if error != nil {
print(error as Any)
return
}
self.handleFBAccessToken()
}
}
func handleFBAccessToken() {
let accessToken = FBSDKAccessToken.current()
guard let accessTokenString = accessToken?.tokenString else { return }
let credentials = FacebookAuthProvider.credential(withAccessToken: accessTokenString)
Auth.auth().signIn(with: credentials) { (user, error) in
if error != nil {
// I assume I handle the errors here
print(error as Any)
return
}
// successfully logged in user
self.instantiateTabVC()
}
FBSDKGraphRequest(graphPath: "/me", parameters: ["fields": "id, name, email"]).start { (connection, result, error) in
if error != nil {
print(error as Any)
}
}
}
我想添加它,以便如果他们已经通过电子邮件/密码创建了帐户,这两个帐户将自动链接/合并(反之亦然)。在“我假设我在这里处理错误”中,我添加了
let providers = Auth.auth().fetchProviders(forEmail: AuthErrorUserInfoEmailKey)
// sign in with existing account
// call linkWithCredential:completion:
获取已存在的电子邮件。我的基础是this和this(两个类似的问题)。我明白前提是
将
fetchProvidersForEmail
与该电子邮件一起使用,该电子邮件将查找与该电子邮件关联的提供商ID。然后,您可以使用其中一个提供程序登录用户。使用现有帐户完成登录后,可以使用导致错误发生的原始凭据调用linkWithCredential:completion:
然而,我是Swift的新手并且对于如何解决这个问题非常困惑。任何示例代码都非常有用。我也试过阅读文档,但这也没有帮助(因为我可能还没有学会正确理解文档)
我希望我正朝着正确的方向努力解决这个问题,但是,如果你有任何其他建议,我会对此持开放态度。我感谢任何帮助
答案 0 :(得分:0)
尝试此方法,如果存在,则不会创建新用户。
func facebook() {
let loginManager: FBSDKLoginManager = FBSDKLoginManager()
loginManager.logIn(withReadPermissions: ["email"], from: self, handler: { result, error in
if let error = error {
self.showMessagePrompt(error.localizedDescription)
} else if result!.isCancelled {
print("FBLogin cancelled")
} else {
// [START headless_facebook_auth]
let credential = FacebookAuthProvider.credential(withAccessToken: FBSDKAccessToken.current().tokenString)
// [END headless_facebook_auth]
self.firebaseLogin(credential)
}
})
}
func firebaseLogin(_ credential: AuthCredential) {
if let user = Auth.auth().currentUser {
// [START link_credential]
user.link(with: credential) { _, error in
// [START_EXCLUDE]
if let error = error {
self.showMessagePrompt(error.localizedDescription)
return
}
// [END_EXCLUDE]
}
// [END link_credential]
} else {
// [START signin_credential]
Auth.auth().signIn(with: credential) { _, error in
// [START_EXCLUDE silent]
self.hideSpinner {
// [END_EXCLUDE]
if let error = error {
// [START_EXCLUDE]
self.showMessagePrompt(error.localizedDescription)
// [END_EXCLUDE]
return
}
// User is signed in
// [START_EXCLUDE]
// Merge prevUser and currentUser accounts and data
// ...
// [END_EXCLUDE]
}
}
// [END signin_credential]
}
}