iOS集成新版Firebase Google SignIn点击登录按钮无响应问题
问题根因
点击按钮无响应的核心问题有两个:
- 你将Google登录触发逻辑直接写在了
viewDidLoad生命周期方法中,没有和GIDSignInButton的点击事件做绑定。viewDidLoad仅在页面首次加载时执行一次,不会响应用户的按钮点击操作;如果页面加载时guard let clientID判断失败触发提前return,整段登录逻辑会直接终止,后续不会再执行。 - 新版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
相关产品推荐
相关产品推荐

