Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.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
Ios 新Apple登录与Google登录冲突,生成2个用户帐户_Ios_Swift_Firebase Authentication_Apple Sign In - Fatal编程技术网

Ios 新Apple登录与Google登录冲突,生成2个用户帐户

Ios 新Apple登录与Google登录冲突,生成2个用户帐户,ios,swift,firebase-authentication,apple-sign-in,Ios,Swift,Firebase Authentication,Apple Sign In,我遇到了一个问题,以前通过谷歌登录或我的应用程序上的电子邮件注册的用户无法登录到与Apple登录相同的帐户(即使电子邮件未隐藏) 尽管授权令牌分别由Apple和Google/Firebase处理,但我们的用户集合中的同一封电子邮件无法合并(保留现有用户帐户,并为现有帐户使用新令牌)。这将导致两个帐户:现有帐户和新帐户,这与新的Apple登录存在问题 有人在iOS应用程序中遇到过这个问题吗?随着即将到来的春季苹果登录要求,他们如何处理2个代币以及合并新帐户和旧帐户 import UIKit imp

我遇到了一个问题,以前通过谷歌登录或我的应用程序上的电子邮件注册的用户无法登录到与Apple登录相同的帐户(即使电子邮件未隐藏)

尽管授权令牌分别由Apple和Google/Firebase处理,但我们的用户集合中的同一封电子邮件无法合并(保留现有用户帐户,并为现有帐户使用新令牌)。这将导致两个帐户:现有帐户和新帐户,这与新的Apple登录存在问题

有人在iOS应用程序中遇到过这个问题吗?随着即将到来的春季苹果登录要求,他们如何处理2个代币以及合并新帐户和旧帐户

import UIKit
import Firebase
import FirebaseAuth
import Pages
import GoogleSignIn
import AuthenticationServices

class FireAuthUserInfo {
    var firstName:String?
    var lastName:String?
    var email:String?

    init(googleUser:GIDGoogleUser) {
        self.firstName = googleUser.profile.givenName
        self.lastName = googleUser.profile.familyName
    }
    @available(iOS 13.0, *)
    init(credential:ASAuthorizationCredential) {
        switch credential {
                  case let appleIDCredential as ASAuthorizationAppleIDCredential:

                  default:
                      break
                  }
    }

}
class UserManager: NSObject {
    static let shared = UserManager()

    func signInWithGoogle (user: GIDGoogleUser) {
        let authentication = user.authentication
        let credential = GoogleAuthProvider.credential(withIDToken: (authentication?.idToken)!,
                                                       accessToken: (authentication?.accessToken)!)
        let userInfo = FireAuthUserInfo(googleUser: user)
        self.authInFirebase(with: credential, user: userInfo)
    }
    @available(iOS 13.0, *)
    func signInWithApple (with credential:AuthCredential, appleUser:ASAuthorizationCredential) {
        let userInfo = FireAuthUserInfo(credential: appleUser)
        self.authInFirebase(with: credential, user: userInfo)
    }
    func authInFirebase(with credential:AuthCredential, user:FireAuthUserInfo? = nil) {
        Utility.showProgress("")
        Auth.auth().signIn(with: credential) { (authResult, error) in
            guard error == nil else { Utility.dismissProgress(); return}
            guard let authResult = authResult else { Utility.dismissProgress(); return}

            // User is signed in
            let refCollection = Constants.db.databaseProfile

            var query = refCollection.whereField("UserID", isEqualTo: authResult.user.uid)
            if let user = user, let email = user.email {
                query =  refCollection.whereField("email", isEqualTo: email)
            }
            query.getDocuments(completion: { (snapShot, error) in
                Utility.dismissProgress()
                guard error == nil else { return}
                if snapShot == nil || snapShot!.isEmpty == true {
                    let userObject = User()
                    userObject.uid = authResult.user.uid
                    userObject.email = authResult.user.email

                    if let user = user {
                        userObject.firstName = user.firstName
                        userObject.lastName = user.lastName
                        if let email = user.email {
                            userObject.email = email
                        }
                    }

                    self.saveProfile(user: userObject)
                    //self.gotoFillDetails(page: 3)
                    self.goToOnBoardingScreens()
                }else {
                    for rest in snapShot!.documents {
                        let restDict = rest.data()
                        guard !(restDict.isEmpty) else {
                            continue
                        }
                        let userData = User.getInstanceFrom(dictionary: restDict)!
                        if let user = user, let email = user.email {
                            userData.email = email
                        }
                        UserDefaultHelper.saveUser(user: userData)
                        AppData.sharedInstance.user = userData
                        AppData.getAllJournalEntries()
                        break
                    }
                    self.gotoMain()
                }

            })
        }
    }

    func saveProfile(user : User) {
        let autoKey = User.getNewKey()
        //        let autoKey = Constants.refs.databaseProfile.childByAutoId().key
        let newProfile = [
            "UserID": user.uid ?? "",
            "Email": user.email ?? "",
            "FirstName": user.firstName ?? "",
            "LastName": user.lastName ?? "",
            "Gender": "",
            "BirthDate": Date(),
            "JobTitle": "",
            "Location": "",
            "TellMeMore": "",
            "Referral": "",
            "Last_Login": Date(),
            "CreatedAt": Date(),
            "UpdatedAt": Date(),
            "ProfileImage": "",
            "Key": autoKey,
            "DeviceToken": AppData.sharedInstance.deviceToken ?? "",
            "FcmToken": AppData.sharedInstance.fcmToken ?? "",
            ] as [String : Any]

        let user = User.getInstanceFrom(dictionary: newProfile)
        user?.saveToFirebase()
        UserDefaultHelper.saveUser(user: user!)
        AppData.sharedInstance.user = user
    }

我已经能够在Apple测试应用程序中重现这些结果:。当用户登录Apple并共享其电子邮件地址时,我可以接收用户的电子邮件,但当用户再次尝试登录时,我无法接收该电子邮件。似乎是苹果的疏忽?

您需要显示您的代码。更新,谢谢@MagnaSar您是否在Firebase项目中使用“每封电子邮件多个帐户”设置?这将导致用户每次登录不同的提供商时创建多个帐户,即使电子邮件是相同的。不,我没有更改默认的@bojeil。默认情况下,每个电子邮件地址一个帐户。您需要显示您的代码。更新,谢谢@magnasar您是否在Firebase项目中使用“每个电子邮件多个帐户”设置?这将导致用户每次登录不同的提供商时创建多个帐户,即使电子邮件是相同的。不,我没有更改默认的@bojeil。默认为每个电子邮件地址一个帐户。