Google SDK更新后GIDGoogleUser相关错误求助(iOS Swift)
Google登录SDK更新后代码错误修复
问题背景
跟着旧YouTube教程开发即时通讯应用,因Google Sign-In SDK版本更新,代码出现两个明确错误:
Instance member 'profile' cannot be used on type 'GIDGoogleUser'Value of type 'GIDGoogleUser' has no member 'authentication'
错误原因及修复方案
错误1修复:移除不必要的可选链调用
代码中user?.profile?.givenName一行存在逻辑问题:前面已经通过guard let user = result?.user将user绑定为非可选实例,无需再用user?的可选链调用,直接使用user.profile即可。
修改前后对比:
- 错误代码:
guard let email = user.profile?.email, let firstName = user?.profile?.givenName, let lastName = user?.profile?.familyName else { return } - 修复后:
guard let email = user.profile?.email, let firstName = user.profile?.givenName, let lastName = user.profile?.familyName else { return }
错误2修复:适配新版SDK的认证凭证获取逻辑
Google Sign-In 6.x版本彻底移除了GIDGoogleUser的authentication属性,需直接从user对象获取ID Token和Access Token:
原错误代码:
let authentication = user.authentication guard let idToken = authentication.idToken else { return } let credential = GoogleAuthProvider.credential(withIDToken: idToken, accessToken: authentication.accessToken)
修复后代码:
guard let idToken = user.idToken?.tokenString, let accessToken = user.accessToken.tokenString else { return } let credential = GoogleAuthProvider.credential(withIDToken: idToken, accessToken: accessToken)
完整修复后的googleButtonTapped方法
@objc func googleButtonTapped() { guard let clientID = FirebaseApp.app()?.options.clientID else { return } let config = GIDConfiguration(clientID: clientID) GIDSignIn.sharedInstance.configuration = config GIDSignIn.sharedInstance.signIn(withPresenting: self) { result, error in guard error == nil else { print("Fail to sign in with Google: \(error!)") return } guard let user = result?.user else { return } // 修复错误1:移除不必要的可选链调用 guard let email = user.profile?.email, let firstName = user.profile?.givenName, let lastName = user.profile?.familyName else { return } UserDefaults.standard.set(email, forKey: "email") UserDefaults.standard.set("\(firstName) \(lastName)", forKey: "name") print("Did sign in with Google: \(user)") DatabaseManager.shared.userExists(with: email) { exists in if !exists { let chatUser = ChatAppUser(firstName: firstName, lastName: lastName, emailAddress: email) DatabaseManager.shared.insertUser(with: chatUser) { success in if success { guard let userProfile = user.profile else { return } if userProfile.hasImage { guard let url = userProfile.imageURL(withDimension: 200) else { return } URLSession.shared.dataTask(with: url) { data, _, error in guard let data = data else { return } let fileName = chatUser.profilePictureFileName StorageManager.shared.uploadProfilePicture(with: data, fileName: fileName) { result in switch result { case .success(let downloadUrl): UserDefaults.standard.set(downloadUrl, forKey: "profile_picture_url") print(downloadUrl) case .failure(let error): print("Storage manager error: \(error)") } } }.resume() } } } } } // 修复错误2:新版SDK获取认证凭证方式 guard let idToken = user.idToken?.tokenString, let accessToken = user.accessToken.tokenString else { return } let credential = GoogleAuthProvider.credential(withIDToken: idToken, accessToken: accessToken) FirebaseAuth.Auth.auth().signIn(with: credential) { [weak self]authResult, error in guard let strongSelf = self else { return } guard authResult != nil, error == nil else { print("failed to log in google credential") return } print("Successfully signed in google credential.") NotificationCenter.default.post(name: .didLogInNotification, object: nil) strongSelf.navigationController?.dismiss(animated: true, completion: nil) } } }
额外注意事项
- 确保你的
GoogleSignInPod版本为6.x及以上,同时匹配Firebase Auth的最新稳定版本 - 若直接获取ID Token失败,可尝试调用
user.getIDToken { token, error in ... }方法异步获取
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

