У меня проблема с тем, что пользователи, ранее зарегистрировавшиеся с помощью входа Google или электронной почты в моем приложении, не могут войти в ту же учетную запись с помощью Apple Sign In (даже если электронная почта не скрыта).
Несмотря на то, что токены авторизации обрабатываются отдельно, Apple и Google / Firebase, одно и то же электронное письмо в нашей Коллекции пользователей не может быть объединено (сохраните существующую учетную запись пользователя и используйте новый токен для существующей учетной записи). Это приводит к 2 учетным записям: существующим и новым, что проблематично c с новым входом в Apple.
Кто-нибудь сталкивался с этой проблемой для своего приложения iOS и с предстоящим весенним требованием Apple Sign In, как они обрабатывают 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: https://developer.apple.com/documentation/authenticationservices/implementing_user_authentication_with_sign_in_with_apple. Когда пользователь входит в Apple и делится своим адресом электронной почты в то время, я могу получать электронную почту пользователя, но когда пользователь пытается войти снова, я не могу получить это письмо. Похоже на недосмотр Apple?