Подтвердить что ты не робот

Firebase - Удаление и переустановка приложения не позволяет не аутентифицировать пользователя

После аутентификации пользователя со следующим кодом (ниже приведена измененная версия моего кода, так что отображается только успешная логика входа)...

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)")
                    }
            })
        }
    })
}

(1.e Запуск и запуск приложения, вход в систему успешно).

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

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

Почему? Я бы подумал, что удаление приложения и его переустановка должны стереть все данные.

Если вы reset Содержание и настройки в симуляторе iOS и установите приложение, свойство firebaseReference.authData снова будет nil.

4b9b3361

Ответ 1

Аутентификационный сеанс Firebase сохраняется на пользовательском устройстве в цепочке ключей iOS. Данные keychain для приложения не удаляются при удалении приложения.

Если вы хотите вручную очистить данные, вы можете сохранить некоторые дополнительные метаданные вместе с приложением и вручную вызвать FirebaseRef.unauth(), чтобы очистить сохраненный сеанс. См. # 4747404: удалите элементы keychain при удалении приложения для дополнительной справки.

Ответ 2

Добавление ниже кода в конце функции didFinishLaunchingWithOptions (до возврата true) AppDelegate работает быстро.

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
}

Ответ 3

Для swift 4 тот же ответ:

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
}

Ответ 4

Используйте расширение ниже:

extension AppDelegate{
func signOutOldUser(){
    if let _ = UserDefaults.standard.value(forKey: "isNewuser"){}else{
        do{
            UserDefaults.standard.set(true, forKey: "isNewuser")
            try Auth.auth().signOut()
        }catch{}
    }
} 
}

и вызовите это в методе "... didFinishLaunchingWithOptions..." Applelegate:

   func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    FirebaseApp.configure()
    signOutOldUser()
    return true
}