Firebase Google SignIn каждый раз запрашивает разрешения

ios swift firebase firebase-authentication google-signin

1561 просмотра

6 ответа

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

Вот код AppDelegate, участвующий в Google SignIn:

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
    }


}

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

Автор: ale00 Источник Размещён: 08.11.2019 11:08

Ответы (6)


3 плюса

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

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

Автор: Todd Kerpelman Размещён: 26.08.2016 10:08

1 плюс

Я не совсем уверен, что вы спрашиваете. Хотите проверить, выполнил ли пользователь вход в свою учетную запись Google?

if (GIDSignIn.sharedInstance().hasAuthInKeychain()) {
    // user is signed in
} else {
    // show login
}
Автор: JAL Размещён: 25.08.2016 01:37

1 плюс

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

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

signIn.signInSilently()

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

искать - (недействительно) знак InSilently в: - Документах Google

Автор: Dravidian Размещён: 26.08.2016 07:39

1 плюс

При успешном входе в Google у меня работал пользователь 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


        }

    }
}
Автор: BoxAndBirdie Размещён: 29.08.2016 10:34

1 плюс

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

Автор: Carlo Размещён: 25.08.2016 05:46

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

И, если вы хотите, чтобы это работало в iOS 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.

РЕДАКТИРОВАТЬ: Источник: https://firebase.google.com/docs/auth/ios/google-signin

Автор: Juan Curti Размещён: 31.08.2016 04:59
Вопросы из категории :
32x32