在Swift 4中使用Firebase实时数据库进行实时运输跟踪

时间:2019-04-25 08:08:44

标签: ios swift google-maps firebase-realtime-database

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()
}

1 个答案:

答案 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