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

SwiftUI中Firebase苹果认证的用户创建与删除逻辑整合方案

SwiftUI Firebase苹果账号认证:创建/删除用户的代码整合与ViewModel设计

针对你的需求,直接给两种落地方案,结合实际开发场景选择:

一、整合到同一个ViewModel(推荐绝大多数场景)

创建和删除用户同属账号生命周期管理,逻辑关联度高,放在同一个ViewModel里不仅维护起来更方便,还能统一管理错误状态、用户登录状态等,避免分散的状态导致的混乱。

示例代码:

import Foundation
import FirebaseAuth
import AuthenticationServices

class AuthViewModel: ObservableObject {
    @Published var errorMsg: String?
    
    // 创建苹果关联的Firebase用户(包含登录逻辑,苹果授权后Firebase会自动处理已有用户登录)
    func createOrSignInAppleUser(credential: ASAuthorizationAppleIDCredential) {
        guard let idToken = credential.identityToken, let rawNonce = UserDefaults.standard.string(forKey: "appleAuthNonce") else {
            errorMsg = "授权信息无效"
            return
        }
        
        let firebaseCredential = OAuthProvider.credential(withProviderID: "apple.com",
                                                          idToken: idToken,
                                                          rawNonce: rawNonce)
        
        Auth.auth().signIn(with: firebaseCredential) { [weak self] result, error in
            guard let self = self else { return }
            if let error = error {
                self.errorMsg = error.localizedDescription
                return
            }
            // 成功后的逻辑:比如跳转主页、更新用户信息
            print("用户创建/登录成功,UID: \(result?.user.uid ?? "")")
        }
    }
    
    // 删除当前登录用户
    func deleteCurrentUser() {
        guard let currentUser = Auth.auth().currentUser else {
            errorMsg = "没有已登录的用户"
            return
        }
        
        currentUser.delete { [weak self] error in
            guard let self = self else { return }
            if let error = error {
                self.errorMsg = error.localizedDescription
                return
            }
            // 成功后的逻辑:比如返回登录页、清空本地缓存
            print("用户账号删除成功")
        }
    }
}

在View中的使用方式:

struct AuthContainerView: View {
    @StateObject private var authVM = AuthViewModel()
    
    var body: some View {
        VStack(spacing: 20) {
            // 苹果登录按钮(省略苹果授权流程实现,拿到credential后调用createOrSignInAppleUser)
            Button("苹果登录/创建账号") {
                // 触发苹果授权,拿到credential后调用 authVM.createOrSignInAppleUser(credential: credential)
            }
            
            if Auth.auth().currentUser != nil {
                Button("删除我的账号") {
                    authVM.deleteCurrentUser()
                }
                .foregroundColor(.red)
            }
            
            // 错误提示
            if let msg = authVM.errorMsg {
                Text(msg)
                    .foregroundColor(.red)
                    .font(.caption)
            }
        }
    }
}

二、分开到不同ViewModel的场景

只有当你的项目架构要求极度拆分职责(比如超大型项目,账号管理被拆分成多个独立子模块),才需要考虑分开。但这种做法会增加状态管理的复杂度,比如错误信息要分别维护,调用时需要注入多个ViewModel,小项目完全没必要。

示例拆分后的代码:

// 负责创建/登录的ViewModel
class AppleAuthSignInViewModel: ObservableObject {
    @Published var errorMsg: String?
    
    func createOrSignInAppleUser(credential: ASAuthorizationAppleIDCredential) {
        // 同上面的创建/登录逻辑
    }
}

// 负责删除用户的ViewModel
class UserAccountDeleteViewModel: ObservableObject {
    @Published var errorMsg: String?
    
    func deleteCurrentUser() {
        // 同上面的删除用户逻辑
    }
}

总结

  • 优先选择同一个ViewModel的方案,逻辑集中、维护成本低,符合大多数SwiftUI项目的状态管理习惯。
  • 拆分ViewModel仅适用于架构要求严格的超大型项目,否则纯属增加不必要的复杂度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 02:32:17