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

SwiftUIKit上传Firestore遇权限拒绝问题求助

问题分析与解决方案

你遇到的权限错误来自Firestore数据库,但你提供的Firebase规则是针对Cloud Storage的,这是核心问题——你没有配置Firestore的安全规则,同时代码中缺少用户登录状态的校验。

1. 配置Firestore安全规则

登录Firebase控制台,找到Firestore数据库的「规则」标签,替换成以下规则(允许已登录用户读写Post集合):

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /Post/{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}

修改后点击「发布」使规则生效。

2. 代码中添加登录状态校验

你的代码中使用了Auth.auth().currentUser?.email,但如果用户未登录,currentUser为nil,此时写入Firestore会触发权限拒绝。在上传方法开头添加登录校验:

@IBAction func yukleTiklandi(_ sender: Any) {
    // 先检查用户是否已登录
    guard let currentUser = Auth.auth().currentUser else {
        hataMesajiGoster(title: "Hata", message: "Lütfen önce giriş yapın.")
        return
    }
    
    // 原有的上传逻辑...
    let storage = Storage.storage()
    let storageReference = storage.reference()
    let mediaFolder = storageReference.child("media")
    if let data = imageView.image?.jpegData(compressionQuality: 0.5){
        let uuid = UUID().uuidString
        let imageReference = mediaFolder.child("\(uuid).jpg")
        imageReference.putData(data) { storagemetadata, error in
            if error != nil {
                self.hataMesajiGoster(title: "Hata", message: error?.localizedDescription ?? "Hata Aldınız, tekrar deneyin.")
            } else {
                imageReference.downloadURL { [self] url, error in
                    if error == nil {
                        let imageUrl = url?.absoluteString
                        if let imageUrl = imageUrl {
                            let firestoreDatabase = Firestore.firestore()
                            // 使用已校验的currentUser的email
                            let firestorePost = ["gorselurl": imageUrl, "yorum" : yorumTextField.text!, "email" : currentUser.email!, "tarih" : FieldValue.serverTimestamp()]
                            
                            firestoreDatabase.collection("Post").addDocument(data: firestorePost) { (error) in
                                if error != nil {
                                    self.hataMesajiGoster(title: "Hata", message: error?.localizedDescription ?? "Hata Aldınız, Tekrar Deneyiniz!")
                                } else {
                                    // 上传成功后可添加提示或页面跳转
                                    hataMesajiGoster(title: "Başarılı", message: "Gönderiniz başarıyla yüklendi!")
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

3. 额外检查项

  • 确保你的项目已正确初始化Firebase:在AppDelegate的didFinishLaunchingWithOptions方法中调用FirebaseApp.configure()
  • 确认用户登录流程正常,比如你有登录页面让用户通过邮箱/密码或其他方式认证
  • 检查Firestore控制台中Post集合是否存在(不存在会自动创建,但确保拼写一致)

内容的提问来源于stack exchange,提问作者이지혜

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 18:51:22