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

iOS集成新版Firebase Google SignIn点击登录按钮无响应问题

问题根因

点击按钮无响应的核心问题有两个:

  1. 你将Google登录触发逻辑直接写在了viewDidLoad生命周期方法中,没有和GIDSignInButton的点击事件做绑定。viewDidLoad仅在页面首次加载时执行一次,不会响应用户的按钮点击操作;如果页面加载时guard let clientID判断失败触发提前return,整段登录逻辑会直接终止,后续不会再执行。
  2. 新版GoogleSignIn 7.0+ SDK已经完全移除了旧版的delegate回调机制,GIDSignInButton默认不会自动触发登录流程,必须手动给控件绑定点击事件,在点击回调中执行登录逻辑。
修复步骤
  • 第一步:将viewDidLoad中整段Google登录、Firebase认证逻辑抽离,封装为独立的点击响应方法,同时删除你不需要的多因素认证冗余代码,只保留获取用户UID的核心逻辑:
@objc private func triggerGoogleSignIn() {
    guard let clientID = FirebaseApp.app()?.options.clientID else {
        print("Firebase clientID 获取失败")
        return
    }
    let signInConfig = GIDConfiguration(clientID: clientID)
    
    GIDSignIn.sharedInstance.signIn(with: signInConfig, presenting: self) { [weak self] googleUser, error in
        if let error = error {
            print("Google授权失败: \(error.localizedDescription)")
            return
        }
        guard let authInfo = googleUser?.authentication,
              let idToken = authInfo.idToken else {
            print("Google授权凭证为空")
            return
        }
        
        // 生成Firebase登录凭证
        let firebaseCredential = GoogleAuthProvider.credential(
            withIDToken: idToken,
            accessToken: authInfo.accessToken
        )
        
        // 执行Firebase登录,移除多因素认证相关冗余代码
        Auth.auth().signIn(with: firebaseCredential) { authResult, error in
            if let error = error {
                print("Firebase登录失败: \(error.localizedDescription)")
                return
            }
            guard let userUID = authResult?.user.uid else { return }
            // 此处拿到UID后即可执行后续业务逻辑,比如页面跳转、用户信息存储
            print("登录成功,用户UID:\(userUID)")
        }
    }
}
  • 第二步:给Storyboard中添加的GIDSignInButton控件拖拽关联IBOutlet到LoginViewController,属性命名参考:
@IBOutlet weak var googleSignInButton: GIDSignInButton!
  • 第三步:在viewDidLoad中给按钮绑定点击事件,不要直接把登录逻辑写在生命周期方法里:
override func viewDidLoad() {
    super.viewDidLoad()
    // 绑定按钮点击响应
    googleSignInButton.addTarget(self, action: #selector(triggerGoogleSignIn), for: .touchUpInside)
}
额外配置检查项

完成上述代码修改后如果仍有问题,逐一核对以下配置:

  • 确认Info.plist中配置的URL Schemes为Firebase配置文件中对应的REVERSED_CLIENT_ID,无拼写错误
  • 如果项目使用了SceneDelegate(iOS 13+默认工程模板),需要在SceneDelegate中补充URL回调处理,否则授权完成后无法跳回APP,代码如下:
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
    guard let url = URLContexts.first?.url else { return }
    GIDSignIn.sharedInstance.handle(url)
}
  • 确认引入的GoogleSignIn依赖版本为7.0.0及以上,旧版本SDK的API写法和新版不兼容。

内容的提问来源于stack exchange,提问作者Manu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:03:25