5

Я пытаюсь запустить google login из AppDelegate.swift, а затем запустить основной экран моего приложения при успешном завершении входа в систему.iOS firebase: FIRAuthUIDelegate.authUI не называется

enter image description here

Я могу

  1. показать кнопку для входа в Google, как показано выше

  2. пользователь отправляется в Google для входа в

  3. пользователь является отправлен обратно на исходный (этап 1)

После шага 3. Я хочу отправить пользователя на главную страницу моего приложения.

Мой код ниже. Проблема, с которой я столкнулся, заключается в том, что authUI не вызывается.

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate, FIRAuthUIDelegate { 
    var window: UIWindow? 
    var authUI: FIRAuthUI? 

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
     FIRApp.configure() 

     authUI = FIRAuthUI.defaultAuthUI() 
     authUI?.delegate = self 
     let providers: [FIRAuthProviderUI] = [FIRGoogleAuthUI()] 
     authUI?.providers = providers 

     // show google login button 
     let authViewController = authUI?.authViewController() 
     self.window = UIWindow(frame: UIScreen.mainScreen().bounds) 
     self.window?.rootViewController = authViewController 
     self.window?.makeKeyAndVisible() 
     return true 
    } 

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

    func authUI(authUI: FIRAuthUI, didSignInWithUser user: FIRUser?, error: NSError?) { 
     // launch main view controller 
    } 
} 

EDIT: Это, кажется, дубликат another question. Название другого вопроса довольно общее, и только детали доходят до нескольких строк. В любом случае, я считаю, что ответ Криса более тщательный, чем тот, который есть. Я думаю, что и вопрос и ответы здесь более ясны, более заострены и более тщательны, поэтому было бы ошибкой просто направлять сюда людей туда, как это было бы, если бы это было отмечено как дубликат.

+0

Вы используете раскадровку? –

+0

@Tarvo, да, я – lf215

+0

Когда вы говорите, что ваш authUI не вызван, вы имеете в виду метод делегирования authUI да? – Chris

ответ

5

Я думаю, что ваша проблема лежит here, в методе - (void)signInWithProviderUI:(id<FIRAuthProviderUI>)providerUI.

Метод делегата вызывается в блоке завершения dismissViewControllerAnimated:completion:.

[self.navigationController dismissViewControllerAnimated:YES completion:^{ 
     [self.authUI invokeResultCallbackWithUser:user error:error]; 
     }]; 

As you can see из документации компании Apple, этот метод, как ожидается, будет называться по модально представленной ViewController. Вы показываете его как контроллер корневого представления. Попробуйте отобразить его с модальным от UIViewController, и все должно получиться. Чтобы отладить эту попытку и установить точку останова на line 193, чтобы увидеть, что она не попадет. Я был бы очень удивлен, если это не сработает, когда вы будете автоматически отображать authController.

Чтобы найти возможное решение вашей проблемы (я предполагаю, что вы хотите, чтобы пользователь вступил в систему перед использованием вашего приложения). Ниже приведено упрощение того, что я использую в приложении в настоящее время.

EDIT: Обновлен для нового синтаксиса 1.0.0 FirebaseUI.

class MainTabController: UITabBarController, FIRAuthUIDelegate { 

    let authUI: FUIAuth? = FUIAuth.defaultAuthUI() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     var authProviders = [FUIFacebookAuth(), FUIGoogleAuth()] 
     authUI.delegate = self 
     authUI.providers = authProviders 

     //I use this method for signing out when I'm developing 
     //try! FIRAuth.auth()?.signOut() 

    } 

    override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated) 

     if !isUserSignedIn() { 
      showLoginView() 
     } 
    } 

    private func isUserSignedIn() -> Bool { 
     guard FIRAuth.auth()?.currentUser != nil else { return false } 
     return true 
    } 

    private func showLoginView() { 
     if let authVC = FUIAuth.defaultAuthUI()?.authViewController() { 
     present(authVC, animated: true, completion: nil) 
     } 
    } 
    func authUI(_ authUI: FUIAuth, didSignInWith user: FIRUser?, error: Error?) { 
     guard let user = user else { 
      print(error) 
      return 
     } 

     ... 
    } 
+0

Можете ли вы сделать вышеуказанный код в объективе c? http://stackoverflow.com/questions/42340641/firauthuidelegate-authui-not-being-called-in-objective-c – shamila

+1

Боюсь, что не @ S.Sallay:/ – Chris

+0

В этой ситуации возникла проблема с попыткой установить authUI в FUIAuth. defaultAuthUI(), как вы вызвали исключение, потому что оно выполнялось до того, как метод FirebaseApp.configure() был запущен в applicationDidFinishLaunchingWithOptions. Немного странно, но инициализация значения в viewDidLoad() вместо этого исправила проблему для меня. – Cognitio

1

Это должно быть проблема ссылки.

class AppDelegate: UIResponder, UIApplicationDelegate, FIRAuthUIDelegate { 
    var window: UIWindow? 
    let authUI = FIRAuthUI.defaultAuthUI() 

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
     FIRApp.configure() 

     authUI.delegate = self 
     let providers: [FIRAuthProviderUI] = [FIRGoogleAuthUI()] 
     authUI.providers = providers 

     // show google login button 
     let authViewController = authUI.authViewController() 
     self.window = UIWindow(frame: UIScreen.mainScreen().bounds) 
     self.window?.rootViewController = authViewController 
     self.window?.makeKeyAndVisible() 
     return true 
    } 
} 

Попробуйте это. AppDelegate будет хранить ссылку authUI и ее delegate.

+0

, внося точные изменения, которые вы написали 'let authUI = FIRAuthUI.defaultAuthUI()' вызвало 'authUI', чтобы быть nil, в результате чего« ​​ожидается, что в конце запуска приложения будут установлены корневые контроллеры ». Я изменил свой код, потянув ссылку на более высокий уровень **, но 'authUI' все еще не запущен **. – lf215

+0

Предупреждение не означает, что authUI равно нулю. это означает, что окно не имеет rootViewController до завершения запуска приложения. Есть две возможности. Один из них - 'authUI.authViewController()' возвращает nil, а другая - 'authUI.authViewController()' isynyn и занимает слишком много времени. Проверить 'authUI.authViewController()' 'возврат не равен нулю. – Ryan

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

  • Нет связанных вопросов^_^