uber会像ola一样实时跟踪运输情况。在我的应用程序中,有两种类型的用户驱动程序,即用户。我想连续跟踪驾驶员的位置,并在Google地图上实时显示给用户。我正在使用swift 4.2 xocode 10.1。任何文档或任何指导都会很多。
我已经安装了Google地图,并指出了起始位置和放下位置,并使用
绘制了一条折线https://maps.googleapis.com/maps/api/directions/json?origin此api。
我还能从驱动程序中获取驱动程序的当前位置。
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
方法。
我阅读了一些有关实时跟踪的文章文档,就像我必须连续获取驱动程序的gps位置并将其发送到Firebase实时数据库,然后再次从用户那里获取Firebase的位置并不得不移动汽车图像以及用户端中的位置。
我执行了同样的操作,将驱动程序位置发送到数据库,并且也可以获取该位置,但无法继续进行操作,请帮助。预先感谢
var locationRefrence: StorageReference {
return Storage.storage().reference().child("Locations")
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let locValue: CLLocationCoordinate2D = manager.location?.coordinate else { return }
print("locations = \(locValue.latitude) \(locValue.longitude)")
if mapViewObj == nil {
mapViewObj = GMSMapView()
let camera = GMSCameraPosition.camera(withLatitude: locValue.latitude, longitude: locValue.longitude, zoom: 16.0)
mapViewObj = GMSMapView.map(withFrame: self.mapView.frame, camera: camera)
mapViewObj.delegate = self
mapViewObj.isMyLocationEnabled = true
mapViewObj.settings.myLocationButton = true
self.mapView.addSubview(mapViewObj)
}
let location = "\(locValue.latitude) \(locValue.longitude)"
firebaseUpload(location: location)
}
func firebaseUpload(location: String) {
let uploadLocationRef = locationRefrence.child("location")
let locationData = location.data(using: .utf8)
let uploadTask = uploadLocationRef.putData(locationData!, metadata: nil) { (metadata, error) in
print(metadata ?? "No metadata")
print(error ?? "No error")
}
uploadTask.observe(.progress) { (snapshot) in
print(snapshot.progress ?? "No progress")
}
uploadTask.resume()
}
func fetchLocationFromFirebase() {
let downloadLocationRef = locationRefrence.child("location")
let downloadTask = downloadLocationRef.getData(maxSize: 1024 * 1024 * 12) { (data, error) in
if let data = data {
let locationStr = String(data: data, encoding: .utf8)
print("Fetched Locations : \(locationStr ?? "Nothing fetched...")")
}
print(error ?? "No error")
}
downloadTask.observe(.progress) { (snapshot) in
print(snapshot.progress ?? "No progress")
}
downloadTask.resume()
}
答案 0 :(得分:0)
我认为您的问题在这里:
let downloadTask = downloadLocationRef.getData(maxSize: 1024 * 1024 * 12) { (data, error) in
我不知道你为什么要这么做?首先,这不是一种获取数据的好方法,但它只会获取当前的内容,并且不会监视任何更新,因此,我认为您需要对Firebase的实时数据库进行更多研究。
对于这种特殊情况,您希望在位置更新时随时进行更新,以便观察“位置”子项是否发生变化
refHandle = postRef.observe(DataEventType.value, with: { (snapshot) in
let postDict = snapshot.value as? [String : AnyObject] ?? [:]
// ...
})
这将为您提供每次更新时Locations表中数据的快照
参考:https://firebase.google.com/docs/database/ios/read-and-write