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
相关产品推荐
相关产品推荐

