所以我有以下代码从 firestore 检索文档,该函数在我的 viewDidLoad() 中调用:
func loadAnnotations() {
db.collection("jumpSpotAnnotations").getDocuments { (querySnapshot, error) in
if let error = error {
print("There was an issue retrieving data from Firestore: \(error)")
let alertController = UIAlertController(title: "Oops!", message: "We are having trouble loading the cliff jumping locations. Be sure to check your internet connection.", preferredStyle: .alert)
let okayAction = UIAlertAction(title: "Okay", style: .cancel, handler: nil)
alertController.addAction(okayAction)
self.present(alertController, animated: true, completion: nil)
} else {
if let snapshotDocuments = querySnapshot?.documents {
//print(snapshotDocuments)
for doc in snapshotDocuments {
其余的功能并不重要。我在检索数据时收到错误:Error Domain=FIRFirestoreErrorDomain Code=7“缺少权限或权限不足。”当我第一次得到这个消息时,我意识到这是因为我从创建应用程序的 Firebase 项目的第一天起就没有更新我的安全规则,并且已经过去了 30 天,所以 Google 不会再访问直到我更新了规则。这些是原始规则:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write;
}
}
}
出于此应用程序的目的,现在我可以满足用户创建和读取任何数据的要求。然而,我不希望他们能够修改或删除数据。所以我在 Stack 上问了一个关于如何做到这一点的问题,并在这里得到了回答:如何防止Firestore文档被删除/修改,但允许所有读取和写入 https://stackoverflow.com/questions/64178236/how-to-prevent-firestore-documents-being-deleted-modified-but-allow-all-reads所以我更新的安全规则现在是:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /collection1/{jumpSpotAnnotations} {
allow read, create;
}
}
}
但是,当我尝试检索数据时,我仍然收到完全相同的错误。新的安全规则已经发布。所以我的问题是,在按发布正式更新后我需要做些什么,并且让我的模拟器能够检索数据,或者我的安全规则中的代码或 Xcode 中的函数是否不正确为了我想做的事。请记住,Xcode 中的功能与原始规则完美配合(我将规则完全开放,就像我第一次制作 Firestore 项目时那样,这样我就可以轻松地在模拟器中进行测试)。任何帮助深表感谢!