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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:30:01