2016-05-25 3 views
2

Я следую https://firebase.google.com/docs/auth/ и хочу использовать FirebaseUI (https://github.com/firebase/FirebaseUI-iOS/tree/master/FirebaseUI) для аутентификации.Как использовать FirebaseUI для аутентификации Google на iOS в Swift?

Пользовательский интерфейс показывает успешно, и я могу нажать «войти в систему с Google», а затем завершить поток веб-знака. Приложение снова открывается URL-адресом auth, но функция authUI никогда не срабатывает. Что не так?

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    // Override point for customization after application launch. 
    FIRApp.configure() 

    let authUI = FIRAuthUI.authUI()!; 
    NSLog("setting up delegate"); 
    authUI.delegate = self; 

    let googleAuthUI = FIRGoogleAuthUI.init(clientID:FIRApp.defaultApp()!.options.clientID); 

    authUI.signInProviders = [googleAuthUI!]; 


    mSplitViewController = self.window!.rootViewController as! UISplitViewController 


    self.window!.rootViewController = authUI.authViewController(); 

    return true 
} 

    func authUI(authUI: FIRAuthUI, didSignInWithUser user: FIRUser?, error:NSError?) { 
    // Implement this method to handle signed in user or error if any. 
    NSLog("logged in"); 

    self.window!.rootViewController = mSplitViewController 
    let navigationController = mSplitViewController!.viewControllers[mSplitViewController!.viewControllers.count-1] as! UINavigationController 

    navigationController.topViewController!.navigationItem.leftBarButtonItem = mSplitViewController!.displayModeButtonItem() 
    mSplitViewController!.delegate = self 

    let masterNavigationController = mSplitViewController! 
     .viewControllers[0] as! UINavigationController 
    let controller = masterNavigationController.topViewController as! MasterViewController 
    controller.managedObjectContext = self.managedObjectContext 
} 


func application(application: UIApplication, 
    openURL url: NSURL, options: [String: AnyObject]) -> Bool { 
     NSLog("opened with url \(url)"); 
     FIRAuthUI.authUI()!.delegate = self; 
     return FIRAuthUI.authUI()!.handleOpenURL(url, sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey] as! String); 
} 
+1

Я чувствую вас. Я тоже пытаюсь это сделать. Документация для этого ужасна, но тогда она все еще бета-версия. – Armand

+1

Ощутите свою боль. Не думайте, что это очень полезно. Старый способ так же хорош и на самом деле проще понять – masb

ответ

1

Я не пробовал это решение, но эта проблема StackOverflow была связана с разделом проблем FirebaseUI repo, и кто-то там ответил;

Obj-C: «Там ошибка, которая предотвращает [[FIRAuthUI authUI] authViewController] от использования в качестве корневого контроллера представления вашего приложения Для устранения этой проблемы использовать контроллер представления заполнителя в качестве контроллера зрения корня вашего приложения, то настоящего [[FIRAuthUI authUI] authViewController] на вершине. Это."

для пользователей Swift: Ошибка: FIRAuthUI.authUI().authViewController() не используется в качестве контроллера корневого представления вашего приложения. Обходной путь заключается в использовании контроллера представлений-заполнителей в качестве контроллера корневого представления вашего приложения, а затем присутствующего на нем FIRAuthUI.authUI().authViewController().

Ссылка: https://github.com/firebase/FirebaseUI-iOS/issues/65

+0

см. Http://stackoverflow.com/a/40310750/1168364 для получения более подробной информации – lf215

2

Является ли ваш AppDelegate FIRAuthUIDelegate?

Во всяком случае, вместо того, чтобы использовать делегат, вы можете использовать FIRAuth слушателя: Func addAuthStateDidChangeListener (слушатель: FIRAuthStateDidChangeListenerBlock) -> FIRAuthStateDidChangeListenerHandle

Вы можете использовать его таким образом:

FIRAuth.auth()?.addAuthStateDidChangeListener { 

    (auth, user) in 

    if user != nil { 

     print("user signed in") 

    } 

} 

Вы можете увидеть рабочий образец на https://github.com/cooliopas/FirebaseAuth-Demo

Его на испанском языке, но я уверен, что вы поймете код.

0

По сути вам нужно добавить ниже корня PLIST.

<key>CFBundleURLTypes</key> 
<array> 
    <dict> 
     <key>CFBundleURLSchemes</key> 
     <array> 
      <string>com.googleusercontent.apps.your-app-id</string> 
     </array> 
    </dict> 
</array> 

Вы можете получить идентификатор приложения из RESERVED_CLIENT_ID записи в вашем GoogleService-Info.plist файл.

Далее, вам нужно будет реализовать метод делегата OpenUrl приложения, как это:

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

Проверьте мой ответ here еще несколько деталей.