iOS集成Firebase Google登录触发GIDSignIn Code=-5用户取消错误
问题根因及修复方案
1. 触发点击延迟、直接报错的核心问题
你给Google登录按钮绑定的触发事件是.allTouchEvents,该事件会在手指接触屏幕、移动、抬起的全阶段多次触发登录方法,首次触发拉起授权流程后,后续重复触发的请求会直接终止上一次未完成的流程,抛出-5 用户取消登录的错误。需要等待数分钟才能点击是因为SDK会暂时拦截短时间内的重复冲突请求,冷却后才能正常触发单次流程。
2. 二次登录报错的问题
- 你没有在调用登录前检查现有登录状态,重复调用
signIn方法会触发会话冲突 - 如果你使用的是iOS13+默认带Scene的项目配置,仅在AppDelegate中处理URL回调无效,需要在SceneDelegate中补充回调处理逻辑
具体修复步骤
- 修改按钮点击事件的触发类型,替换为仅在用户抬起手指时触发单次登录:
把viewDidLoad中按钮添加事件的代码改为:
self.googleButton.addTarget(self, action: #selector(configureGoogleButton), for: .touchUpInside)
- 优化登录逻辑,增加已有用户判断、登录前会话清理:
@objc func configureGoogleButton(){ // 优先恢复之前的登录会话,不需要重复拉起授权 if GIDSignIn.sharedInstance.hasPreviousSignIn() { GIDSignIn.sharedInstance.restorePreviousSignIn { [weak self] user, error in guard let self = self, error == nil, let user = user, let idToken = user.authentication.idToken else { // 恢复失败,发起新的登录流程 self?.startNewSignInFlow() return } let credential = GoogleAuthProvider.credential(withIDToken: idToken, accessToken: user.authentication.accessToken) // 你的后续业务逻辑 self.googleCredential = credential print(user.profile?.email) } return } // 无历史会话,发起新登录 startNewSignInFlow() } private func startNewSignInFlow() { guard let clientID = FirebaseApp.app()?.options.clientID else { return } let config = GIDConfiguration(clientID: clientID) // 清理之前残留的会话,避免冲突 GIDSignIn.sharedInstance.signOut() GIDSignIn.sharedInstance.signIn(with: config, presenting: self) { [weak self] user, error in guard let self = self, error == nil else { print("登录失败", error ?? "未知错误") return } guard let authentication = user?.authentication, let idToken = authentication.idToken else { return } let credential = GoogleAuthProvider.credential(withIDToken: idToken, accessToken: authentication.accessToken) // 你的后续业务逻辑 self.googleCredential = credential print(user.profile?.email) print(user.profile?.name) } }
- 如果项目使用了SceneDelegate,补充URL回调处理:
在SceneDelegate.swift中添加以下方法:
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) { guard let url = URLContexts.first?.url else { return } GIDSignIn.sharedInstance.handle(url) }
内容的提问来源于stack exchange,提问作者Mihai Șerban
相关产品推荐
相关产品推荐

