Meine App hat also die Möglichkeit, sich bei Google anzumelden. Durch Klicken auf die von Google bereitgestellte Schaltfläche wird eine Webansicht geöffnet, in der der Benutzer seine Anmeldeinformationen eingeben muss. Nachdem der App der Zugriff auf ihre Informationen ermöglicht wurde, meldet sie den Benutzer an und ändert den SignInViewController in den TabBarController (wo er nun entsprechend interagieren kann).
Wenn der Benutzer eine Abmelde-Schaltfläche drückt, wird er wie erwartet zum Anmeldebildschirm geleitet. Die seltsame Sache ist jedoch, wenn der Nutzer den Google-Button erneut drückt, wird er automatisch ohne weitere Authentifizierung und ohne die Möglichkeit, sein Konto zu entfernen, angemeldet. Ist es eine Möglichkeit, die Anmeldeinformationen des Google-Kontos zu löschen, um die Benutzer vor versehentlichem Diebstahl zu schützen?
Anmeldefunktion:
func signIn(signIn: GIDSignIn!, didSignInForUser user: GIDGoogleUser!, withError error: NSError!) {
if let error = error {
print(error.localizedDescription)
return
}
let authentication = user.authentication
let credential = FIRGoogleAuthProvider.credentialWithIDToken(authentication.idToken, accessToken: authentication.accessToken)
FIRAuth.auth()?.signInWithCredential(credential) { (user, error) in
// ...
SignInViewController().signedIn(user)
}
// ...
}
Abmeldefunktion:
func signOutOverride() {
do {
try! FIRAuth.auth()!.signOut()
CredentialState.sharedInstance.signedIn = false
// Set the view to the login screen after signing out
let storyboard = UIStoryboard(name: "SignIn", bundle: nil)
let loginVC = storyboard.instantiateViewControllerWithIdentifier("SignInVC") as! SignInViewController
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
appDelegate.window?.rootViewController = loginVC
} catch let signOutError as NSError {
print ("Error signing out: \(signOutError)")
}
}
Swift
versuche GIDSignIn.sharedInstance().signOut()
Ziel c
[[GIDSignIn sharedInstance] signOut];
Ja, wie @Rahul sagte, der folgende Code wäre der richtige Weg, um es zu tun.
GIDSignIn.sharedInstance().signOut()
https://developers.google.com/identity/sign-in/ios/sign-in?ver=Swift#sign_out_the_user
public func logOut(on:UIViewController){
let firebaseAuth = Auth.auth()
do {
try firebaseAuth.signOut()
GIDSignIn.sharedInstance().signOut()
GIDSignIn.sharedInstance().disconnect()
if let url = NSURL(string: "https://www.google.com/accounts/Logout?continue=https://appengine.google.com/_ah/logout?continue=https://google.com"){
UIApplication.shared.open(url as URL, options: [:]) { (true) in
let appDel:AppDelegate = UIApplication.shared.delegate as! AppDelegate
appDel.window?.rootViewController = LoginViewController()
}
}
} catch let signOutError as NSError {
Help.shared.Snack(messageString: "Error signing out: \(signOutError)"
)
print ("Error signing out: %@", signOutError)
}
}
Wollte ein wenig auf die vorherigen Antworten eingehen, nachdem er mit dem GoogleSignIn
-SDK gespielt hatte.
Ich sah die signOut()
- und disconnect()
-Methoden und fragte mich, was die Unterschiede waren.
signOut()
ist ein synchroner Aufruf:
// Immediately sets GIDSignIn.sharedInstance()?.currentUser to nil.
// For example, if the user is already signed in:
print(GIDSignIn.sharedInstance()?.currentUser != nil) // true - signed in
GIDSignIn.sharedInstance()?.signOut()
print(GIDSignIn.sharedInstance()?.currentUser != nil) // false - signed out
disconnect()
ermöglicht einem Benutzer, den Zugriff auf die App zusätzlich zum Abmelden zu widerrufen. Ich gehe davon aus, dass sie Ihrer App alle Berechtigungen erneut erteilen müssen, wenn sie sich erneut anmelden möchten.
Laut Google-Entwicklerdokumente Wenn ein Nutzer disconnect von Ihrer App wählt, müssen Sie alle Google-Daten des Nutzers entfernen, die in Ihrer App gespeichert wurden.
Außerdem ist disconnect()
asynchron. Das Ergebnis des Trennungsaufrufs wird an die GIDSignInDelegate.sign(_:didDisconnectWith:withError:)
-Methode zurückgegeben.
// Also sets GIDSignIn.sharedInstance()?.currentUser to nil.
// Asynchronous call. If for example the user was already signed in:
print(GIDSignIn.sharedInstance()?.currentUser != nil) // true - signed in
GIDSignIn.sharedInstance()?.disconnect()
print(GIDSignIn.sharedInstance()?.currentUser != nil) // true - still signed in
// MARK: - GIDSignInDelegate
func sign(_ signIn: GIDSignIn!, didDisconnectWith user: GIDGoogleUser!, withError error: Error!) {
print(GIDSignIn.sharedInstance()?.currentUser != nil) // false - signed out
// Remove any data saved to your app obtained from Google's APIs for this user.
}