Firebase+SwiftUI应用创建账户时出现Network is down错误求助
问题分析
从日志和代码来看,核心问题有三个:
- 加载状态未正确重置:注册流程完成后,
isLoading没有被设为false,导致加载动画持续显示,页面无法正常跳转。 - 异步API混用:同时使用了Firestore的
setData(completion:)回调和async/await语法,导致成功分支的状态更新逻辑遗漏。 - Network is down日志:这是gRPC层的连接警告,Firebase SDK自带离线缓存机制,数据已经成功写入缓存并会同步到云端,所以不影响核心功能,但可以通过配置优化避免这类警告。
解决方案
1. 修复加载状态与异步逻辑
将registerUser函数中的setData(completion:)替换为async/await版本,统一错误处理逻辑,确保无论成功还是失败都能正确更新isLoading状态:
func registerUser(){ isLoading = true Task{ do{ // Step 1: 创建Firebase账户 try await Auth.auth().createUser(withEmail: emailID, password: password) // Step 2: 上传头像到Storage guard let userUID = Auth.auth().currentUser?.uid else { await setError(NSError(domain: "", code: -1, userInfo: [NSLocalizedDescriptionKey: "无法获取用户ID"])) return } guard let imageData = userProfilePicData else { await setError(NSError(domain: "", code: -1, userInfo: [NSLocalizedDescriptionKey: "请选择头像"])) return } let storageRef = Storage.storage().reference().child("profile_Images").child(userUID) let _ = try await storageRef.putDataAsync(imageData) // Step 3: 获取头像下载链接 let downloadURL = try await storageRef.downloadURL() // Step 4: 创建用户模型 let user = User(username: userName, userBio: userBio, userBioLink: userBioLink, userUID: userUID, userEmail: emailID, userProfileURL: downloadURL) // Step 5: 写入Firestore(使用async/await版本) try await Firestore.firestore().collection("Users").document(userUID).setData(from: user) // 成功更新用户信息与状态 await MainActor.run { print("Saved Successfully") userNameStored = userName self.userUID = userUID profileURL = downloadURL logStatus = true isLoading = false // 重置加载状态 } }catch{ // 失败时删除已创建的账户 try? await Auth.auth().currentUser?.delete() await setError(error) } } }
2. 优化Network is down警告
这个警告来自gRPC的IPv6连接尝试,若测试环境IPv6支持不稳定,可以尝试:
- 切换到稳定的Wi-Fi网络,确保设备/模拟器网络连接正常
- 在
Info.plist中添加Firestore域名的网络配置:<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <false/> <key>NSExceptionDomains</key> <dict> <key>firestore.googleapis.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSExceptionRequiresForwardSecrecy</key> <true/> </dict> </dict> </dict> - 更新Firebase SDK到最新版本,新版本的gRPC对网络兼容性更好
3. 额外检查点
- 确保
User结构体正确实现了Codable协议,否则setData(from:)会执行失败 - 确认Firestore的安全规则允许新用户写入数据,避免隐性权限错误
验证效果
修改后点击创建账户按钮:
- 用户数据会成功写入Firestore和Storage
isLoading被正确重置,加载动画自动消失logStatus设为true,自动跳转到mainView
内容的提问来源于stack exchange,提问作者Derrick
相关产品推荐
相关产品推荐

