#swift #firebase #google-cloud-firestore
#swift #firebase #google-облако-firestore
Вопрос:
Я создаю приложение, основанное на местоположении. Пользователи могут видеть других людей в радиусе 10 миль. У меня хранятся общедоступные данные, такие как имена, и некоторые частные, такие как широта и долгота и геохеш. Как я могу создать модель для этих данных, чтобы свести к минимуму операции чтения и обеспечить максимальную безопасность и производительность. В настоящее время у меня есть Users
коллекция и документы для каждого пользователя внутри этой коллекции, которые содержат все общедоступные и личные данные. Мой текущий код выглядит следующим образом
db.collection("Users").whereField("geohash", >=: geohash_prefix)
.whereField("geohash", <=: "geohash_prefix" "~").getDocuments { (querySnapshot, err) in
if err != nil{
print("(err!.localizedDescription)")
}else{
if querySnapshot!.isEmpty{
return completion(arr_of_users)
}
for document in querySnapshot!.documents {
let d = document.data()
let isWithin = CLLocationCoordinate2D(latitude: (d["loc"] as! GeoPoint).latitude, longitude: (d["location"] as! GeoPoint).longitude).isWithin(min: self.MBR.1, max: self.MBR.0) //just used for filtering documents not in radius
if !isWithin{ //skip all docs not in range
continue
}
nearPeople.append([d["firstName"] as! String, d["lastName"] as! String])
}
}
Итак, вы можете видеть, что для отображения имени и фамилии пользователя для всех, кто находится в радиусе 10 миль, я должен отправлять данные о местоположении клиенту, что небезопасно. Я также не могу разделить его на вложенную коллекцию, потому что мне нужно получить имена и другую общедоступную информацию, для которой потребуется второй запрос (больше чтений). Я знаю, что Google cloud functions полностью изолирован от клиента, так что это мой единственный вариант? Это приведет к снижению производительности? Кроме того, я уверен, что приложения такого типа не редкость, каков наиболее распространенный подход к этому?
Комментарии:
1. Привет, Кунал. Я попытался уточнить ниже. У вас была возможность прочитать это? Это лучше объясняет, почему вы не можете безопасно запрашивать эти данные непосредственно из кода приложения?
2. Привет, Фрэнк. Да, сейчас я использую облачные функции для выполнения запросов к геохешам. Вы также упомянули, что пользователь может изменить свое местоположение для запроса из любого места, но решена ли эта проблема сейчас, поскольку они не могут получить данные о местоположении, поскольку они защищены облачной функцией?
Ответ №1:
Как я уже говорил на ваш предыдущий вопрос: чтобы иметь возможность запрашивать определенные данные, пользователь должен иметь возможность читать эти данные. И поскольку Firestore не может выполнить ваше isWithin(min: self.MBR.1, max: self.MBR.0)
условие на сервере, это означает, что им, по крайней мере, потребуется доступ ко всем данным внутри db.collection("Users").whereField("geohash", >=: geohash_prefix).whereField("geohash", <=: "geohash_prefix" "~")
.
Если вы хотите ограничить доступ к определенному набору геоштоков в коллекции, ваши правила безопасности должны будут связать местоположение, вокруг которого вы запрашиваете, с соответствующими геоштоками. Хотя я не говорю, что это невозможно сделать, глядя на эту реализацию в geofire, она кажется по меньшей мере далекой от тривиальной.
Ваш самый прямой подход — сделать это действительно в облачных функциях.
Я не уверен, что делают большинство других приложений, но это может помочь понять, что у вас также нет способа убедиться, что пользователь отправляет свое фактическое местоположение в базу данных. Таким образом, даже если вы даете идеальные результаты для местоположения / диапазона, ничто не мешает им повторно запрашивать другое местоположение, чтобы по-прежнему получать все данные вашего пользователя.