如何在 swift 3 中使用 Google 地图跟踪用户实时位置?

How to track User Live Location by using Google Maps in swift 3?

我是 Swift 和 Google 地图的新手,任何人都可以建议如何使用 Google 地图跟踪用户实时位置 Swift 3.

对于此任务,您需要将 Google Maps SDK 集成到您的项目中。 This RayWenderlich tutorial 是 iOS 上 Google 地图的入门指南。

但如果您不依赖 Google 地图,即您没有特定需求,请考虑使用 Apple Maps(MapKit)。不要将不必要的依赖项集成到您的项目中。

您还需要 CoreLocation。这是 Apple 的所有位置相关的库。由此得名。 :]

不久前,I wrote 一个单例对象用于检索项目范围内的用户位置。有了它,单个实体可以检索位置信息,您可以在整个项目中访问它而不会重复。拥有多个 CoreLocationManager 或将其放入您的 AppDelegate 是一种不好的做法。一开始你可能不明白,但后来就是这样了。

您需要考虑几个步骤。

总体而言,您需要:

  • 使用核心位置获取位置更新CLLocation
  • 初始化 Google 地图视图 GMSMapView
  • 每次获得更新时,您都会将地图视图动画化到新位置
  • 如果要跟踪路径,请使用 GMSPathGMSPolyline

所以...

使用 Core Location 获取位置更新:

  • 您需要导入库
  • 创建一个 CLLocationManager 的实例,它是管理更新的class
  • 实施 CLLocationManagerDelegate 方法来接收每个更新

你可以阅读苹果的文档here

初始化 Google 地图视图:

每次获得更新时,您都会将地图视图动画化到新位置:

  • 这是跟踪发生的地方,每次您在 CLLocationManagerDelegate 的委托方法中获得更新时,您将获得一个 CLLocation 的数组,您可以使用它来为您的映射到新位置。

示例(内部委托方法):

...
 let newLocationCoordinate = locations.last!.coordinate
 self.mapView.animate(toLocation: newLocationCoordinate)
// mapView should be of type GMSMapView

如果要跟踪路径,请使用 GMSPathGMSPolyline:

  • 为此,您需要存储 GMSPathGMSPolyline 的实例,在 viewDidLoad 或您的初始化代码中初始化它们。

  • 每次收到更新时,您应该执行以下操作:

    // Say your GMSPath instance is called trackingPath:
    trackingPath.add(locations.last!.coordinate)
    // Say your GMSPolyline instance is called trackingPolyline:
    // You clear the mapView to remove obsolete polyline
    mapView.clear()
    // You update your polyline with the path
    trackingPolyline.path = path
    // You add the polyline to the UI by pointing its map atribute to your mapView
    trackingPolyline.map = mapView
    

这是您应该做的事情的一个非常粗略的整体,但我希望它能让您了解要遵循哪些步骤。 Google 的指南非常完整,您可以按照他们的要求更好地了解他们的库是如何工作的。如果您的应用程序正在跟踪美国的用户,您也可以使用 Apple 的 MapKit,我不建议将 Apple 的 MapKit 用于其他地区。 Google地图对美国以外地区的地址格式和街道准确性提供了更好的支持。

如果多个视图访问位置使用单例来优化性能,Can 的建议是使用单例来访问位置是目前为止您应该做的。整个应用中只有一个实例应该管理位置更新并将它们传递给必要的视图。