Firebaseのrealtime database/firestoreを試してみたくて、お互いの端末の位置情報を共有できないかとやってみました。まずやったのは、2台の端末が共有するドキュメントを作って地図にプロットするようにしてみました。ここでは「loc」としました。
位置情報はお互いが常に許可にし、バックグラウンドでも取得するようにし、
public func locationManager(_ manager: CLLocationManager,
didUpdateLocations locations: [CLLocation])
で値を取得し(多少ゴミは取り除き)、Firestoreにアップするようにしたところ、
let name = UIDevice.current.name
let data: [String: Any] = [
"name":name,
"createAt":FieldValue.serverTimestamp(),
"latitude":latitude,
"longitude":longitude]
defaultstore.collection("data").addDocument(data: messageData)
if let err = err {
print("Error writing document: \(err)")
} else {
print("Document successfully written!")
}
なんと1日持ちませんでした。
この時のLocationManagerの設定は
locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
locationManager.distanceFilter = 5
locationManager.activityType = .fitness
locationManager.requestAlwaysAuthorization()
locationManager.allowsBackgroundLocationUpdates = true
locationManager.pausesLocationUpdatesAutomatically = false
です。が、今回上限を超えたのは位置情報の書き込みではなく、読み込み側の方でした。
ViewControllerのdidLoadで下記のようにそれまでにたまっていたデータも読み込んでいたためと思われます。
defaultstore.collection("data").addSnapshotListener { (snapShot, error) in
guard let value = snapShot else {
print("snapShot is nil")
return
}
value.documentChanges.forEach{diff in
if diff.type == .added {
// 地図にプロット
}
}
}
よくよく考えると、過去の居場所は不要なので、FirestoreにはaddDocumentをやめて、setDataでアップデートするように変更。
defaultstore.collection("data").document(name).setData(data) { err in
if let err = err {
print("Error writing document: \(err)")
} else {
print("Document successfully written!")
}
}
そして、読み込み側は、.addedに加えて、.modifiedも追加しました。
数字は減りましたが、相手の居場所が更新されたと同時に読み取り、地図の位置を更新するっていうのは、2端末でこの数字じゃダメですね。chat程度ならせっかくなのでFirestoneではなく、別のアーキテクチャを考えてみたいと思います。