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

Google登录实现报错求助:类型转换及API调用问题

SwiftUI Google登录ViewModel错误修复方案

错误原因分析与修复步骤

错误1:signIn方法参数不匹配及闭包错误

错误原因:Google SignIn SDK(6.x及以上版本)更新了API签名,旧版本的signIn(with:presenting:completion:)方法被替换,参数顺序、类型及闭包参数均发生变化,导致类型转换错误和多余闭包提示。

修复方式:

  • 先配置GIDSignIn的全局configuration,再调用新版本的signIn(withPresenting:)方法,闭包参数改为GIDSignInResult?和Error?,从result中提取用户信息。

错误2:GIDGoogleUser无authentication成员

错误原因:新版本SDK移除了GIDGoogleUser的authentication属性,令牌信息直接通过idToken和accessToken属性获取。

修复方式:

  • 直接通过user.idToken?.tokenString获取ID令牌,user.accessToken.tokenString获取访问令牌。

修正后的完整代码

import SwiftUI
import Firebase
import GoogleSignIn
import FirebaseAuth

class SignInViewModel: ObservableObject {
    enum SignInState {
        case signedIn
        case signedOut
    }

    @Published var state: SignInState = .signedOut

    func signIn() {
        if GIDSignIn.sharedInstance.hasPreviousSignIn() {
            GIDSignIn.sharedInstance.restorePreviousSignIn { result, error in
                guard let user = result?.user else {
                    if let error = error {
                        print(error.localizedDescription)
                    }
                    return
                }
                self.authenticateUser(for: user)
            }
        } else {
            guard let clientID = FirebaseApp.app()?.options.clientID else { return }
            
            // 配置全局GIDSignIn
            GIDSignIn.sharedInstance.configuration = GIDConfiguration(clientID: clientID)
            
            guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene else { return }
            guard let rootViewController = windowScene.windows.first?.rootViewController else { return }
            
            // 调用新版本signIn方法
            GIDSignIn.sharedInstance.signIn(withPresenting: rootViewController) { result, error in
                guard let user = result?.user else {
                    if let error = error {
                        print(error.localizedDescription)
                    }
                    return
                }
                self.authenticateUser(for: user)
            }
        }
    }

    private func authenticateUser(for user: GIDGoogleUser) {
        guard let idToken = user.idToken?.tokenString else {
            print("无法获取ID令牌")
            return
        }
        let accessToken = user.accessToken.tokenString
        
        let credential = GoogleAuthProvider.credential(withIDToken: idToken, accessToken: accessToken)
        
        Auth.auth().signIn(with: credential) { [unowned self] (_, error) in
            if let error = error {
                print(error.localizedDescription)
            } else {
                self.state = .signedIn
            }
        }
    }
}

额外说明

  • 确保项目中安装的是最新版本的GoogleSignIn和FirebaseAuth依赖(可通过CocoaPods或Swift Package Manager更新)。
  • 将枚举signInState改为首字母大写的SignInState,符合Swift命名规范。
  • 优化了错误处理逻辑,确保每个分支都有明确的错误提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 13:35:07