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

Firebase+SwiftUI应用创建账户时出现Network is down错误求助

问题分析

从日志和代码来看,核心问题有三个:

  1. 加载状态未正确重置:注册流程完成后,isLoading没有被设为false,导致加载动画持续显示,页面无法正常跳转。
  2. 异步API混用:同时使用了Firestore的setData(completion:)回调和async/await语法,导致成功分支的状态更新逻辑遗漏。
  3. 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的安全规则允许新用户写入数据,避免隐性权限错误
验证效果

修改后点击创建账户按钮:

  1. 用户数据会成功写入Firestore和Storage
  2. isLoading被正确重置,加载动画自动消失
  3. logStatus设为true,自动跳转到mainView

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 05:32:03