【问题标题】:Unable to create new Documents in Firestore无法在 Firestore 中创建新文档
【发布时间】:2019-01-10 17:05:53
【问题描述】:

我最近在我的一个 iOS 应用中切换到 Firestore。我正在尝试将一些设置存储在“设置”集合中。

我有以下代码:

let data = FSSettings().store() // returns [String : Any]

let db = Firestore.firestore()
let document = db.collection("settings").document(uid) // I tried this

document.setData(data)
{
   error in
   Swift.print(error?.localizedDescription)
}

// And this..
db.collection("settings").addDocument(data: data)
{
    error in
    Swift.print(error?.localizedDescription)
}

根据 Firestore 文档,这将创建文档(以及集合)。但是没有创建文档。我在 print() 行设置了一个断点,但这也永远不会被调用。

这是我在 Firestore 中的规则:

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

这应该也可以,因为我已经登录了。我还尝试了使用事务的不同方法:

let db = Firestore.firestore()
let document = db.collection("settings").document(uid)

db.runTransaction(
{
   transaction, errorPointer in

   transaction.updateData(data, forDocument: document)
})
{
   // Completion
   object, error in
   if let error = error
   {
       Swift.print(error.localizedDescription)
   }
}

运行此语句时,将打印以下行:

Transaction failed all retries.

我错过了什么?我的应用在 iOS 12.0 上运行,并使用最新的 Firebase/Firestore 版本 (CocoaPods)。

当我手动创建文档时,我可以毫无问题地更改值,只是创建失败。

【问题讨论】:

  • 您的第一段代码非常适合我。我设置了两个本地变量 let data = ["name": "Test"]let uid = "uid_0" 没有进行其他更改并运行代码。它创建了一个 settings 集合和文档 uid_0,其中 name: uid_0。所以我的猜测是 let data = FSSettings().store() 返回 nil 或者存在规则问题,或者您可能没有经过身份验证*
  • 你好,store()方法返回6个key/value对,所以数据不为空。我更改了安全规则以允许一切,但它仍然不起作用。最令人困惑的部分是该方法甚至不返回错误。如果这是一个安全问题,我希望至少会返回一个错误。
  • 同意,但我确实将您的代码复制并粘贴到应用程序中,进行了我提到的两个更改并运行它,它工作正常。

标签: swift firebase google-cloud-firestore


【解决方案1】:

Firestore 初始化似乎需要一些时间。这些设置是在应用程序启动时创建的,因此 Firestore 尚未初始化。运行上面的代码,稍微延迟 2 秒就可以了。

【讨论】:

  • 这听起来不对。我的应用程序中的代码立即在第一个 viewController 的第一个 viewDidLoad 函数中运行。也许是您的互联网连接。我会更深入地挖掘,因为这有点可疑。唯一的 Firestore 初始化在 appDelegate didFinishLaunchingWithOptions 函数中,应该是 FirebaseApp.configure()
  • 问题是,它是在 applicationDidFinishLaunching 中运行的测试代码(几乎在调用 FirebaseApp.configure() 之后)。
猜你喜欢
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 2021-04-15
  • 2015-10-13
  • 1970-01-01
  • 2018-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多