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
相关产品推荐
相关产品推荐

