You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:12:39