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
.
Ответы
Ответ 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
}