Проверьте, зарегистрирован ли E-mail от Apple Вход в Firebase - PullRequest
2 голосов
/ 23 марта 2020

Внутри моего приложения пользователь может Войти через Apple . Создание учетной записи работает нормально (с использованием Firebase ). Однако, прежде чем пользователь действительно войдет в систему, я хотел бы проверить, зарегистрирован ли пользователь или нет. Для этого мне нужен адрес электронной почты. Проблема в том, что я не могу получить доступ к электронной почте должным образом, поскольку я получаю found nil - ошибка .

Это мой function, который должен обрабатывать check / signIn :

// delegate functions
func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
  if let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential {
    guard let nonce = currentNonce else {
      fatalError("Invalid state: A login callback was received, but no login request was sent.")
    }
    guard let appleIDToken = appleIDCredential.identityToken else {
      print("Unable to fetch identity token")
      return
    }
    guard let idTokenString = String(data: appleIDToken, encoding: .utf8) else {
      print("Unable to serialize token string from data: \(appleIDToken.debugDescription)")
      return
    }

    let credential = OAuthProvider.credential(withProviderID: "apple.com", idToken: idTokenString, rawNonce: nonce)
    print("email: " + appleIDCredential.email!)
    let email = appleIDCredential.email

    Auth.auth().fetchSignInMethods(forEmail: email!) { (methods, error) in

         if error != nil {
            // show error popUp
             Utilities.showErrorPopUp(labelContent: "Fehler", description: error!.localizedDescription)
         } else {
             // no error -> check email adress

             // Email is not registered -> sign up
             if methods == nil {

                 print("signed in")
                 let usernameVC = self.storyboard?.instantiateViewController(withIdentifier: "UsernameVC") as! UserNameVC
                 usernameVC.credential = credential
                 usernameVC.signInOption = "apple"
                 self.navigationController?.pushViewController(usernameVC, animated: true)

             }
             // Email is registered -> login
             else {

                Auth.auth().signIn(with: credential, completion: { (user, error) in
                    if error != nil {
                        Utilities.showErrorPopUp(labelContent: "Fehler beim Login", description: error!.localizedDescription)
                    } else {

                        // set user status to logged-in
                        UserDefaults.standard.setIsLoggedIn(value: true)
                        UserDefaults.standard.synchronize()

                        // stop animation
                        self.logoAnimation.stop()

                        //transition to home
                        self.transitionToHome()
                    }
                })
             }
         }
    }
  }
}

Как я уже сказал, это не работает, когда пользователь уже вошел в систему, это работает только в том случае, если пользователь регистрируется в первый раз, в противном случае может возникнуть проблема с получением электронного письма.

Кто-нибудь знает обходной путь или что-нибудь о том, как решить эту проблему?

Ответы [ 3 ]

2 голосов
/ 01 апреля 2020

Если вы не можете получить доступ к свойству электронной почты с учетными данными, это означает, что пользователь уже выполнил вход с помощью своего appleId в приложении один раз, поэтому вы можете принять решение, зарегистрирован ли этот пользователь в этом приложении или нет:

// .....

guard let email = appleIDCredential.email {
    // User already signed in with this appleId once
    Auth.auth().signIn(with: credential, completion: { (user, error) in
        // .......
    })
}

Auth.auth().fetchSignInMethods(forEmail: email) { (methods, error) in
    // .......
})
0 голосов
/ 01 апреля 2020

С помощью @ Никиты я наконец-то заработал. Как предполагает, я сначала проверил погоду или нет, я могу получить доступ к email. Мой последний function выглядит так:

let credential = OAuthProvider.credential(withProviderID: "apple.com", idToken: idTokenString, rawNonce: nonce)

    guard appleIDCredential.email != nil else {
        // User already signed in with this appleId once
        Auth.auth().signIn(with: credential, completion: { (user, error) in

            DataHandler.checkIfAppleUserExists(uid: (user?.user.uid)!) { (exists) in
                if exists { // user has firebase-profile -> login
                    if error != nil {
                        Utilities.showErrorPopUp(labelContent: "Fehler beim Login", description: error!.localizedDescription)
                    } else {

                        UserDefaults.standard.setIsLoggedIn(value: true)
                        UserDefaults.standard.synchronize()

                        self.logoAnimation.stop()

                        self.transitionToHome()
                    }
                } else { // user doesn't have firebase-profile -> create username
                    let usernameVC = self.storyboard?.instantiateViewController(withIdentifier: "UsernameVC") as! UserNameVC
                    usernameVC.credential = credential
                    usernameVC.signInOption = "appleExists"
                    self.navigationController?.pushViewController(usernameVC, animated: true)
                }
            }

        })
        return
    }

    // first time apple sign in
    let usernameVC = self.storyboard?.instantiateViewController(withIdentifier: "UsernameVC") as! UserNameVC
    usernameVC.credential = credential
    usernameVC.signInOption = "apple"
    self.navigationController?.pushViewController(usernameVC, animated: true)
  }

Я также реализовал вспомогательную функцию checkIfAppleUserExists, которая проверяет, действительно ли пользователь был создан внутри Firebase. Если это так, пользователь входит в систему, в противном случае он попадает на UsernameVC, в котором создается профиль Firebase.

0 голосов
/ 23 марта 2020

Если вы хотите проверить, вошел ли пользователь в систему, вы можете проверить это следующим образом:

import FirebaseAuth

if Auth.auth().currentUser != nil {
// the user is signed in
} else {
// the user in not signed in
}
...