我正在浏览Google示例应用程序Friendly Pix的iOS源代码,并注意到我对他们使用的登录逻辑有些不了解。具体来说,在他们的AppDelegate.swift
代码(此处为完整源代码)中,他们使用以下代码来设置授权属性:
let authUI = FUIAuth.defaultAuthUI()
authUI?.delegate = self
authUI?.tosurl = kFirebaseTermsOfService
authUI?.isSignInWithEmailHidden = true
let providers: [FUIAuthProvider] = [FUIGoogleAuth(), FUIFacebookAuth()]
authUI?.providers = providers
稍后,他们通过最终调用此方法来处理登录回调:
func handleOpenUrl(_ url: URL, sourceApplication: String?) -> Bool {
if FUIAuth.defaultAuthUI()?.handleOpen(url, sourceApplication: sourceApplication) ?? false {
return true
}
return GIDSignIn.sharedInstance().handle(url, sourceApplication: sourceApplication, annotation: nil)
}
这让我想到了我的问题:他们为什么称GIDSignIn.sharedInstance().handle(...)
?由于FUIGoogleAuth()
是FUIAuth.defaultAuthUI()
的提供商之一,因此调用FUIAuth.defaultAuthUI()?.handleOpen(...)
不会在内部处理任何Google登录吗?在什么情况下,GIDSignIn
方法的handle()
会做任何尚未通过调用handleOpen()
方法FUIAuth
完成的事情?
我想这也许是为了处理FUIAuth.defaultAuthUI()
可以返回nil
的可能性,但是,如果发生这种情况,我认为该应用程序永远不会发展到这一步,因为触发回调的身份验证是:
let authViewController = FUIAuth.defaultAuthUI()?.authViewController()
authViewController?.navigationBar.isHidden = true
self.present(authViewController!, animated: true, completion: nil)
如果nil
authViewController
,它将在最后一行崩溃(如果FUIAuth.defaultAuthUI()
返回nil
,则会发生这种情况)。
我使用的是现已弃用的Firebase邀请函,但它不接受Firebase Auth令牌。我正在更新代码,应该很快就会出来。