Swift中Firebase谷歌/脸书登录点击继续无响应求助
我之前碰到过几乎一模一样的问题!咱们一步步排查,应该能解决:
可能的原因及解决方案
1. 先确认URL Scheme配置没出错
不管是谷歌还是Facebook登录,都得在Info.plist里加对应的URL Scheme,这是回调能正常走的基础:
- 谷歌的Scheme格式是
com.googleusercontent.apps.{{你的谷歌客户端ID}},直接从Firebase控制台的谷歌登录配置页复制就行,别自己瞎拼 - Facebook的Scheme是
fb{{你的Facebook应用ID}},注意开头必须是fb加上你的ID - 验证方法:打开
Info.plist的「URL Types」项,核对每个登录方式的Scheme拼写完全正确,没有多空格或者少字符
2. 重点检查SceneDelegate的回调实现(iOS 13+必看)
如果你的项目用了SceneDelegate(iOS 13及以后的新项目默认都是),必须实现scene(_:openURLContexts:)方法,否则登录的回调根本传不到Firebase,SFSafariViewController自然弹不出来:
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) { guard let url = URLContexts.first?.url else { return } // 处理谷歌登录回调 if GIDSignIn.sharedInstance.handle(url) { return } // 处理Facebook登录回调 if ApplicationDelegate.shared.application( UIApplication.shared, open: url, sourceApplication: nil, annotation: [UIApplication.OpenURLOptionsKey.annotation] ) { return } }
要是你的项目还支持iOS 12及以下,别忘了在AppDelegate里补application(_:open:options:):
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { // 谷歌登录 if GIDSignIn.sharedInstance.handle(url) { return true } // Facebook登录 if ApplicationDelegate.shared.application( app, open: url, sourceApplication: options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String, annotation: options[UIApplication.OpenURLOptionsKey.annotation] ) { return true } return false }
3. 确认Firebase初始化时机正确
一定要在App启动的时候就完成Firebase配置,比如在SceneDelegate的scene(_:willConnectTo:options:)或者AppDelegate的application(_:didFinishLaunchingWithOptions:)里加:
FirebaseApp.configure() // 谷歌登录额外要设置clientID GIDSignIn.sharedInstance.clientID = FirebaseApp.app()?.options.clientID
别等到登录按钮点击时才初始化,那样会导致回调逻辑异常。
4. 检查登录触发代码的代理与回调
看看你写的登录按钮点击代码,有没有正确设置回调,比如谷歌登录的代码要确保传对presenting的视图控制器:
@IBAction func googleLoginTapped(_ sender: UIButton) { guard let clientID = FirebaseApp.app()?.options.clientID else { print("Firebase未初始化") return } let config = GIDConfiguration(clientID: clientID) GIDSignIn.sharedInstance.signIn(with: config, presenting: self) { user, error in if let error = error { print("谷歌登录出错:\(error.localizedDescription)") return } // 拿到用户信息后去Firebase认证 guard let auth = user?.authentication else { return } let credential = GoogleAuthProvider.credential(withIDToken: auth.idToken, accessToken: auth.accessToken) Auth.auth().signIn(with: credential) { result, error in if let error = error { print("Firebase认证失败:\(error.localizedDescription)") return } // 登录成功后的逻辑,比如跳转到主页 } } }
这里的presenting: self必须是当前的视图控制器,不能传nil或者其他无关的控制器,不然弹窗后的跳转逻辑会失效。
5. 最后试试基础排查手段
要是上面的都检查过还不行,试试这些简单方法:
- 重启模拟器或者真机,有时候系统缓存会搞鬼
- 检查设备的「设置」-「隐私与安全性」里,有没有限制Safari的访问权限(虽然这种情况很少见,但不妨一试)
我当时就是漏写了SceneDelegate里的回调方法,导致点击继续后啥反应都没有,按照上面的步骤排查应该能解决你的问题!
内容的提问来源于stack exchange,提问作者Ramesh R C
相关产品推荐
相关产品推荐

