Estoy implementando la autenticación de Firebase usando la clase OAuthProvider para iniciar sesión con una cuenta personal de Microsoft.
He seguido estas instrucciones: https://firebase.google.com/docs/auth/ios/microsoft-oauth?authuser=0
Sin embargo, cuando uso OAuthProvider de Firebase SDK, no aparece la página de inicio de sesión de Microsoft; en realidad, getCredentialWith no invoca nada.
Cuando uso GoogleAuthProvider, todo funciona bien y Firebase SDK muestra la página de inicio de sesión de Google.
let provider = OAuthProvider(providerID: "microsoft.com") provider.scopes = ["files.readwrite.appfolder", "user.read"] provider.getCredentialWith(nil, completion: { credential, error in if let error = error { os_log("Firebase Error: %@", type: .fault, error as CVarArg) return } if (credential != nil) { Auth.auth().signInAndRetrieveData(with: credential!, completion: { authResult, error in if let error = error { os_log("Firebase Error: %@", type: .fault, error as CVarArg) return } }) } })Declarar en alcance global como a continuación
var provider: OAuthProvider? var authMicrosoft: Auth? @IBAction func buttonTapped(_ sender: Any) { provider = OAuthProvider(providerID: "microsoft.com") provider?.customParameters = [ "prompt": "consent", "login_hint": "", ] provider?.scopes = ["mail.read", "calendars.read"] provider?.getCredentialWith(nil ) { credential, error in if error != nil { // Handle error. } print(credential?.provider) if let x = credential { self. authMicrosoft?.signIn(with: x) { authResult, error in if error != nil { // Handle error. } print(authResult?.additionalUserInfo?.profile) print(authResult?.user.providerID) } } else { } } }Parece que define un proveedor localmente. Si bien la llamada getCredentialWith(_:completion) se ejecuta de forma asíncrona, es posible que su función local ya haya terminado de ejecutarse y que ARC ya haya desasignado el proveedor.
Para resolver su problema, es posible que deba retener específicamente el puntero del proveedor en algún lugar, por ejemplo, en su controlador de vista como una propiedad o ivar, y de esa manera el proveedor se puede crear/reciclar cuando su controlador de vista se inicializa/desasigna.