Firebase - 删除并重新安装应用程序不会取消对用户进行身份验证

时间:2015-01-11 23:42:04

标签: ios swift 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)")
                    }
            })
        }
    })
}

(即启动并运行应用程序,成功登录)。

如果您随后删除该应用并在同一设备上重新安装,则此调用(我在应用委托中使用以确定用户是否已登录)将始终返回他们已登录的信息。

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

为什么?我原以为删除应用程序并重新安装它应该擦除所有数据。

如果您重置iOS模拟器中的内容和设置,并安装该应用,则firebaseReference.authData属性将再次为nil

4 个答案:

答案 0 :(得分:38)

Firebase身份验证会话保留在iOS钥匙串中的用户设备上。卸载应用程序时,应用程序的钥匙串数据被删除。

如果您希望手动清除数据,可以将一些其他元数据与应用程序一起存储,并手动调用FirebaseRef.unauth()以清除持久会话。有关其他参考,请参阅#4747404: Delete keychain items when an app is uninstalled

答案 1 :(得分:19)

在AppDelegate的didFinishLaunchingWithOptions函数(返回true之前)末尾添加以下代码可以很快地运行。

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
}

答案 2 :(得分:5)

对于swift 4同样的答案:

Query q=dbRef.orderByChild("13/exam/exam_date")

答案 3 :(得分:0)

使用以下扩展名:

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

并在Appdelegate的'... didFinishLaunchingWithOptions ...'方法中调用此方法:

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