定位服务以及地图官方文档翻译 - 获取用户定位

原文地址

获取用户定位

应用程序将位置数据用于多种用途,从社交网络到导航服务。它们通过 Core Location 框架的类获取位置数据。这个框架提供了几个服务,您可以使用它们来获取和检测设备的当前位置:

  • 标准位置服务 (standard location service) 提供了一种高度可配置的方式来获取当前位置并持续跟踪变更。
  • 区域检测允许您检测已规定的地理区域和蓝牙低能耗信标区域的边界交叉情况。(Beacon 区域检测仅在 iOS 中可用)
  • 显著变更(Significant-Change)位置服务提供一种仅在设备的位置发生显著变化时才会更新当前位置的方法,但应该正确使用它以避免太高的能耗,这一点非常重要。

要了解如何在节省电量的同时为用户提供出色的位置感知体验,请参阅 降低位置准确度和持续时间
要使用 Core Location 框架的功能,您必须在 Xcode 中将CoreLocation.framework链接到您的应用中 。要访问框架的类和头文件,请在任何相关源文件的顶部包含 #import <CoreLocation / CoreLocation.h>
有关 Core Location 框架类的所有信息,请参阅 Core Location Framework Reference

在 iOS 应用程序中提供位置服务

如果您的 iOS 应用程序需要位置服务,请在应用程序的 Info.plist 文件中包含UIRequiredDeviceCapabilities 项。 App Store 使用此密钥中的信息来阻止用户将应用程序下载到不支持所列功能的设备。
UIRequiredDeviceCapabilities 的值是一个字符串数组,表明应用程序所需的功能。其中有两个字符串与位置服务相关:

  • 如果您需要位置服务,请包括 location-services 字符串。
  • 如果您的应用需要仅由 GPS 硬件才能提供的准确度,请包含 gps 字符串。

重要提示:如果您的 iOS 应用程序添加了位置服务但程序本身却能在没有它们的情况下成功运行,那么就请不要在 UIRequiredDeviceCapabilities 键对应的数组中包含相应的字符串了。
有关 UIRequiredDeviceCapabilities 键的更多信息,请参阅 Information Property List Key Reference

获取用户的当前位置

Core Location 可让您找到设备的当前位置,并在您的应用中使用该信息。框架会将设备的位置报告给您的代码,并且根据您配置服务的方式,还可以进行动态更新。
有两个服务可以为您提供用户的当前位置:

  • 标准位置服务(standard location service)是一种可配置的通用解决方案,用于获取指定精确度的位置数据和跟踪位置变化。
  • 显著更改位置服务(significant-change location service)仅在设备位置发生重大变化(例如500米或更长)时才会提供更新。

收集位置数据是一项耗电量大的操作。对于大多数应用程序,通常只需建立初始定位,然后在此之后定期获取更新。无论您的应用中位置数据的重要性如何,您都应该选择合适的位置服务并明智地使用它以避免耗尽设备的电池电量。例如:

  • 如果您的 iOS 应用程序必须在后台保持监控位置,请使用标准位置服务并指定 UIBackgroundModes 键的值为 location 以继续在后台运行并接收位置更新。 (在这种情况下,您还应确保位置管理器的 pausesLocationUpdatesAutomatically 属性设置为 YES 以帮助节省电量。)可能需要此类位置更新的应用程序示例是健身或精细导航应用程序。
  • 如果 GPS 级精度对您的应用并不重要,并且您不需要连续跟踪,则可以使用显著更改位置服务。正确使用显著更改位置服务至关重要,因为这些更新会持续不间断地运行,直到您停止它们为止,如果不能有效使用,实际上可以实现更高的能耗。

确定位置服务是否可用

在某些情况下,位置服务可能不可用。 例如:

  • 用户在“设置”应用程序或“系统偏好设置”中禁用位置服务。
  • 用户拒绝特定应用的位置服务。
  • 设备处于飞行模式,无法启动必要的硬件。

由于这些原因,建议您在尝试启动标准或重要更改位置服务之前始终调用 CLLocationManagerlocationServicesEnabled 类方法。 如果它返回 NO 并且您无论如何都尝试启动位置服务,系统会提示用户确认是否应重新启用位置服务。 由于用户可能故意禁用了位置服务,因此该提示可能不受欢迎。

启动标准位置服务(Standard Location Service)

标准位置服务是获取用户当前位置的最常用方式,因为它可在所有设备以及 iOS 和 OS X 中使用。在使用此服务之前,您可以通过指定所需的位置数据精度和距离来配置它,并且你必须移动一定距离它才能报告新的位置。启动服务时,它使用指定的参数来确定要启用的硬件,然后继续向应用程序报告位置事件。由于该服务考虑了这些参数,因此最适合需要对位置事件的传递进行更细粒度控制的应用程序如导航应用程序或任何需要高精度定位数据或定期更新的应用程序。由于此服务通常需要位置跟踪硬件支持更长的时间,因此可能会导致更高的电量消耗。

要使用标准位置服务,请创建 CLLocationManager 类的实例,并配置其 desiredAccuracy 和 distanceFilter 属性。若要开始接收位置通知,请为对象指定一个 delegate 并调用 startUpdatingLocation 方法。当位置数据可用时,LocationManager 通知其指定的委托对象。如果位置更新已经开始回调,您还可以直接从 CLLocationManager 对象获取最新的位置数据,而无需等待新的回调。要停止位置更新的传递,请调用 LocationManager 对象的 stopUpdatingLocation 方法。

清单1-1显示了一个配置 LocationManager 的示例方法。示例方法是类的一部分,该类将 LocationManager 对象缓存在一个成员变量中,以便以后使用。(该类还实现了 CLLocationManagerDelegate 协议,充当了 LocationManager 的 delegate )由于该应用不需要精确的位置数据,它将位置服务配置为仅报告用户的大致区域,并且在用户移动至少半公里时发送通知。

清单1-1 启动标准位置服务

- (void)startStandardUpdates
{
    // Create the location manager if this object does not
    // already have one.
    if (nil == locationManager)
        locationManager = [[CLLocationManager alloc] init];

    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;

    // Set a movement threshold for new events.
    locationManager.distanceFilter = 500; // meters

    [locationManager startUpdatingLocation];
}
The code for receiving location updates from this service is shown in Receiving Location Data from a Service.

从服务接收位置更新的代码在 Receiving Location Data from a Service 中。

使用显著位置更改服务(Significant-Change Location Service)

创建 CLLocationManager 类的实例,为其指定一个 delegate,并调用 startmonitoring 显著位置更改方法,如清单1-2所示。当位置数据可用时,LocationManager 将通知其指定的 delegate。如果位置更新已经回调,您还可以直接从 CLLocationManager 对象获取最新的位置数据,而无需等待新事件的回调。

注意:显著更改的位置服务需要 kCLAuthorizationStatusAuthorizedAlways 的授权状态

清单1-2启动显著位置更改服务

- (void)startSignificantChangeUpdates
{
    // Create the location manager if this object does not
    // already have one.
    if (nil == locationManager)
        locationManager = [[CLLocationManager alloc] init];

    locationManager.delegate = self;
    [locationManager startMonitoringSignificantLocationChanges];
}

与标准位置服务一样,位置数据按照下面的从服务接收位置数据的描述将数据传递给 delegate。要停止重要的更改位置服务,请调用 stopMonitoringSignificantLocationChanges 方法。
如果你让显著变化的位置服务继续运行,而你的 iOS 应用随后却被挂起或终止,当新的位置数据到达时,该定位服务会自动唤醒你的应用。在唤醒时,应用程序被放到后台,你有少量的时间(大约10秒)手动重启位置服务并处理位置数据。(在提交任何挂起的位置更新之前,您必须在后台手动重新启动位置服务,就像在下面的知道何时启动位置服务中所述)。因为您的应用程序位于后台,所以它必须执行最少的工作并避免任何任务(例如 查询网络)这种可能会在时间到期之前都还没返回的任务。否则,您的应用程序将被终止。如果 iOS 应用程序需要更多时间来处理位置数据,它可以使用UIApplication 类的 beginBackgroundTaskWithName:expirationHandler: 方法请求更多的后台执行时间。

注意:当用户在全局或您的应用程序中禁用后台应用程序刷新设置时,显著更改位置服务不会重新启动您的应程序。此外,当后台应用程序刷新关闭时,应用程序即使在前台也不会收到显著更改或区域检测事件。

从服务接收位置数据

top Created with Sketch.