【发布时间】: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