Firebase: la eliminación y reinstalación de la aplicación no anula la autenticación de un usuario

Después de autenticar a un usuario con el siguiente código (a continuación se muestra una versión recortada de mi código, solo se muestra la lógica de inicio de sesión correcta) …

let firebaseReference = Firebase(url: "https://MY-FIREBASE.firebaseio.com") 

 FBSession.openActiveSessionWithReadPermissions(["public_profile", "user_friends"], allowLoginUI: true, completionHandler: { session, state, error in if state == FBSessionState.Open { let accessToken = session.accessTokenData.accessToken firebaseReference.authWithOAuthProvider("facebook", token: accessToken, withCompletionBlock: { error, authData in if error != nil { // Login failed. } else { // Logged in! println("Logged in! \(authData)") } }) } }) } 

(Es decir, iniciar y ejecutar la aplicación, iniciar sesión correctamente).

Si luego elimina la aplicación y la vuelve a instalar en el mismo dispositivo, esta llamada, que estoy utilizando en la aplicación para determinar si un usuario está conectado, siempre devolverá que está conectado.

 if firebaseReference.authData == nil { // Not logged in } else { // Logged in } 

¿Porqué es eso? Hubiera pensado que borrar la aplicación y volver a instalarla debería borrar todos los datos.

Si restablece el Contenido y la Configuración en el simulador de iOS, y la instala, la propiedad firebaseReference.authData volverá a ser nil .

La sesión de autenticación de Firebase persiste en el dispositivo del usuario en el llavero iOS. Los datos de llavero para la aplicación no se eliminan cuando la aplicación se desinstala.

Si está buscando borrar los datos manualmente, puede almacenar algunos metadatos adicionales junto con su aplicación y llamar manualmente FirebaseRef.unauth() para borrar la sesión persistente. Ver # 4747404: Eliminar elementos de llavero cuando se desinstala una aplicación para una referencia adicional.

Agregar código a continuación al final de la función didFinishLaunchingWithOptions (antes de devolver verdadero) de AppDelegate funciona rápidamente.

 let userDefaults = NSUserDefaults.standardUserDefaults() if userDefaults.valueForKey("appFirstTimeOpend") == nil { //if app is first time opened then it will be nil userDefaults.setValue(true, forKey: "appFirstTimeOpend") // signOut from FIRAuth do { try FIRAuth.auth()?.signOut() }catch { } // go to beginning of app } else { //go to where you want } 

Para swift 4, la misma Respuesta:

 let userDefaults = UserDefaults.standard if userDefaults.value(forKey: "appFirstTimeOpend") == nil { //if app is first time opened then it will be nil userDefaults.setValue(true, forKey: "appFirstTimeOpend") // signOut from FIRAuth do { try Auth.auth().signOut() }catch { } // go to beginning of app } else { //go to where you want }