2016-08-20 2 views
9

Я внедрил Google SignIn с Firebase в моем приложении iOS, следуя руководству Firebase. Проблема в том, что каждый раз, когда я проверяю логин, он всегда запрашивает разрешения.
enter image description hereFirebase Google SignIn запрашивает каждый раз для разрешений

Вот код AppDelegate участвует в Google для входа в аккаунт:

class AppDelegate: UIResponder, UIApplicationDelegate, GIDSignInDelegate { 

    var window: UIWindow? 


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool { 
     // Override point for customization after application launch. 
     FIRApp.configure() 

     GIDSignIn.sharedInstance().clientID = FIRApp.defaultApp()?.options.clientID 
     GIDSignIn.sharedInstance().delegate = self 


     return true 
    } 

    func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { 
     return GIDSignIn.sharedInstance().handle(url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String, annotation: options[UIApplicationOpenURLOptionsKey.annotation]) 
    } 

    func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) { 

     if let error = error { 
      print(error.localizedDescription) 
      return 
     } 


     print("Logged in with Google successfull") 


     // ... Firebase authentication ... 

    } 
} 

А вот код View Controller с GIDSignInButton:

import UIKit 

class IntroViewController: UIViewController, GIDSignInUIDelegate { 


    @IBOutlet weak var signInButton: GIDSignInButton! 


    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 

     GIDSignIn.sharedInstance().uiDelegate = self 
     signInButton.style = .wide 
    } 


} 

Я искал много на но ничего не нашел ... Итак, как я могу каждый раз просить разрешения?

+1

Пожалуйста, добавьте больше информации – renjithr

+0

@renjithr Я отредактированную и добавил еще несколько информации – ale00

+0

Извините, если я сделал некоторые ошибки с языком, я итальянским – ale00

ответ

1

Я не совсем уверен, что вы просите. Вы хотите проверить, был ли пользователь уже зарегистрирован в своей учетной записи Google?

if (GIDSignIn.sharedInstance().hasAuthInKeychain()) { 
    // user is signed in 
} else { 
    // show login 
} 
+0

Нет, я бы не стал запрашивать разрешения каждый раз – ale00

+0

@ ale00 Я не понимаю. Вы должны вытолкнуть пользователя в Google для входа в систему/время разрешения, в которое они входят. Если вы хотите определить, были ли они уже вошли в систему, используйте код в моем ответе и не показывайте пользовательский интерфейс для входа. – JAL

+0

Я знаю, что в первый раз, когда они используют мое приложение, они должны принимать разрешения, но проблема в том, что каждый раз, когда я выхожу из системы, а затем вхожу в систему с той же учетной записью, они спрашивают меня о разрешениях (экран в верхней части вопроса) @JAL – ale00

1

Вы можете переопределить проблему таким образом: Вы должны хранить в внутренней базе данных вашей currentID и когда вы открываете приложение, которое вы получите currentID и, следовательно, вы получите всю информацию для вашего пользователя. У меня была такая же проблема с Facebook Login, и я решил с этой проблемой. Хорошая работа

1

Вы можете попробовать войти в пользователя молча, но вы должны убедиться, что Wether или нет, если GIDAuthentication свойства уже доступны для вас или нет, такие как - idToken, ..etc маркер доступа

Тогда просто позвоните по

signIn.signInSilently() 

при условии, что signIn является параметром типа GIDSignIn

ищет - (Недействительными) signInSilently в: - Google Docs

3

Я считаю, что это работает, как предполагалось. Проблема заключается в том, что вы подписываете пользователя при тестировании своего приложения, а библиотека входа в Google делает предположение, что если пользователь явно выписал ваше приложение, он должен снова попросить пользователя разрешить подписания этого пользователя в.

Если вы не явно выйти пользователю, как signIn() вызовы и вызовы signInSilently() удастся без отображения какой-либо экран входа.

+0

Отличное объяснение. Это помогло мне понять, что –

1

Об успешном Вход в Google, Authentication firebase пользователь работал для меня, я использовал следующий код,

func signIn(signIn: GIDSignIn!, didSignInForUser user: GIDGoogleUser!, withError error: NSError?) { 
    if error != nil { 
     return 
    } 
    let authentication = user.authentication 
    let credential = FIRGoogleAuthProvider.credentialWithIDToken(authentication.idToken, 
                   accessToken: authentication.accessToken) 
    FIRAuth.auth()?.signInWithCredential(credential) { (user, error) in 


     } 

    } 
} 
0

Согласно Firebase официальной документации, вы должны добавить следующую функцию в AppDelegate:

func application(application: UIApplication, 
    openURL url: NSURL, options: [String: AnyObject]) -> Bool { 
    return GIDSignIn.sharedInstance().handleURL(url, 
     sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as? String, 
     annotation: options[UIApplicationOpenURLOptionsAnnotationKey]) 
} 

и, если вы хотите, чтобы это работало в прошивке 8 и меньше, вы должны добавить функцию у вас уже есть:

func application(application: UIApplication, 
    openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool { 
    var options: [String: AnyObject] = [UIApplicationOpenURLOptionsSourceApplicationKey: sourceApplication, 
             UIApplicationOpenURLOptionsAnnotationKey: annotation] 
    return GIDSignIn.sharedInstance().handleURL(url, 
     sourceApplication: sourceApplication, 
     annotation: annotation) 
} 

Вы можете попробовать добавить обе функции (как предложено Firebsae) и посмотреть, исправляет ли эта ошибка. Я не уверен, что это решит проблему, но, по крайней мере, это улучшение функции GID.

EDIT: Источник: https://firebase.google.com/docs/auth/ios/google-signin

Смежные вопросы