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

Google SDK更新后GIDGoogleUser相关错误求助(iOS Swift)

Google登录SDK更新后代码错误修复

问题背景

跟着旧YouTube教程开发即时通讯应用,因Google Sign-In SDK版本更新,代码出现两个明确错误:

  1. Instance member 'profile' cannot be used on type 'GIDGoogleUser'
  2. 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)
        }
    }
}

额外注意事项

  • 确保你的GoogleSignIn Pod版本为6.x及以上,同时匹配Firebase Auth的最新稳定版本
  • 若直接获取ID Token失败,可尝试调用user.getIDToken { token, error in ... }方法异步获取

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 15:45:08