如何基于SwiftUI 2.0架构配置Firebase Google SignIn 6.0.2
SwiftUI 集成最新版 GoogleSignIn 实现方案
第一步:扩展 UIApplication 适配弹出载体要求
原 UIKit 代码中需要传入 UIViewController 作为登录弹窗的承载容器,SwiftUI 场景下可通过扩展 UIApplication 统一获取当前根控制器解决该问题:
extension UIApplication { func getRootViewController() -> UIViewController? { guard let screen = self.connectedScenes.first as? UIWindowScene else { return nil } guard let root = screen.windows.first?.rootViewController else { return nil } return root } }
第二步:封装登录逻辑适配 SwiftUI 状态管理范式
将登录逻辑封装到 ObservableObject 类型的视图模型中,符合 SwiftUI 数据驱动的开发规则:
import Firebase import GoogleSignIn class GoogleAuthViewModel: ObservableObject { // 可绑定到视图的登录状态、错误提示 @Published var isLoggedIn = false @Published var errorMessage: String? func signInWithGoogle() { guard let clientID = FirebaseApp.app()?.options.clientID else { return } let config = GIDConfiguration(clientID: clientID) // 替换原代码中的 presenting: self,用扩展方法获取根控制器 guard let presentingVC = UIApplication.shared.getRootViewController() else { return } GIDSignIn.sharedInstance.signIn(with: config, presenting: presentingVC) { [weak self] user, error in if let error = error { self?.errorMessage = error.localizedDescription return } guard let authentication = user?.authentication, let idToken = authentication.idToken else { return } let credential = GoogleAuthProvider.credential( withIDToken: idToken, accessToken: authentication.accessToken ) // 执行 Firebase 登录逻辑 Auth.auth().signIn(with: credential) { authResult, error in if let error = error { self?.errorMessage = error.localizedDescription return } self?.isLoggedIn = true // 可在此处补充登录成功后的用户信息存储逻辑 } } } }
第三步:在 SwiftUI 视图中调用登录方法
直接在视图层通过按钮触发登录逻辑,状态变更自动刷新视图:
struct LoginView: View { @StateObject private var authVM = GoogleAuthViewModel() var body: some View { Button { authVM.signInWithGoogle() } label: { Text("使用Google账号登录") .padding() .background(.red) .foregroundColor(.white) .cornerRadius(8) } // 错误提示弹窗 .alert(isPresented: .constant(authVM.errorMessage != nil)) { Alert( title: Text("登录失败"), message: Text(authVM.errorMessage ?? "未知错误"), dismissButton: .default(Text("确定")) { authVM.errorMessage = nil } ) } } }
补充回调配置
在App入口处添加 Google 登录回调处理:
@main struct YourApp: App { @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate var body: some Scene { WindowGroup { LoginView() // 处理Google登录回调 .onOpenURL { url in GIDSignIn.sharedInstance.handle(url) } } } }
内容的提问来源于stack exchange,提问作者netsplatter
相关产品推荐
相关产品推荐

