版本记录
版本号 | 时间 |
---|---|
V1.0 | 2017.11.26 |
前言
很多的app都有定位功能,比如说滴滴,美团等,他们都需要获取客户所在的位置,并且根据位置推送不同的模块数据以及服务,可以说,定位方便了我们的生活,接下来这几篇我们就说一下定位框架
CoreLocation
。感兴趣的可以看我写的上面几篇。
1. CoreLocation框架详细解析 —— 基本概览(一)
2. CoreLocation框架详细解析 —— 选择定位服务的授权级别(二)
3. CoreLocation框架详细解析 —— 确定定位服务的可用性(三)
4. CoreLocation框架详细解析 —— 获取用户位置(四)
Overview
使用地区监测来确定用户何时进入或离开地理区域。
区域监控(也称为地理围栏)是用户在进入或退出某个地理区域时收到警报的一种方式。 您可以使用区域监视来执行位置相关的任务。 例如,提醒应用程序使用它们在用户到达或离开指定位置时触发提醒,如图Figure 1
所示。
在iOS中,区域由系统监视,当用户穿过定义的区域边界时,系统会根据需要唤醒您的应用程序。 在macOS中,只有在应用程序正在运行时(无论是在前台还是在后台),用户的系统都处于清醒状态,区域监视才会起作用。 系统不会启动Mac应用程序来传递与区域相关的通知。
Define and Monitor a Geographic Region - 定义和监视地理区域
区域是以地理坐标为中心的圆形区域,您可以使用CLCircularRegion
对象定义一个区域。 区域对象的半径定义了其边界。 您可以通过调用CLLocationManager
对象的startMonitoringForRegion:
方法来定义要监视的区域,并在系统中注册它们。 系统监视您的区域,直到您明确要求停止或直到设备重新启动。
Listing 1
显示了如何配置和注册以该方法的调用者提供的点为中心的区域。 该方法使用最大允许半径来定义区域的边界,并要求系统仅在用户进入该区域时才发送通知。
// Listing 1 Monitoring a region around the specified coordinate
func monitorRegionAtLocation(center: CLLocationCoordinate2D, identifier: String ) {
// Make sure the app is authorized.
if CLLocationManager.authorizationStatus() == .authorizedAlways {
// Make sure region monitoring is supported.
if CLLocationManager.isMonitoringAvailable(for: CLCircularRegion.self) {
// Register the region.
let maxDistance = locationManager.maximumRegionMonitoringDistance
let region = CLCircularRegion(center: center,
radius: maxDistance, identifier: identifier)
region.notifyOnEntry = true
region.notifyOnExit = false
locationManager.startMonitoring(for: region)
}
}
}
需要注意:区域是依赖特定硬件功能的共享资源。 为了确保所有应用程序都可以参与区域监控,
Core Location
可以防止任何单个应用程序同时监控20多个区域。 要解决此限制,只监视接近用户当前位置的区域。 随着用户移动,根据用户的新位置更新列表。
Handle a Region-Related Notification - 处理区域相关的通知
每当用户跨越您应用程序的某个注册区域的边界时,系统会通知您的应用程序。 如果跨界发生时iOS应用程序没有运行,系统会尝试启动它。 支持区域监控的iOS应用程序必须启用位置更新后台模式,以便在后台启动。
边界通道通知将传送到您的位置管理器的代表对象。 具体来说,位置管理器调用其代理的locationManager:didEnterRegion:
或locationManager:didExitRegion:
方法。 如果您的应用程序已启动,则必须立即配置CLLocationManager
对象和代理对象,以便您可以接收这些通知。 要确定您的应用程序是否为位置事件启动,请在启动选项字典中查找UIApplicationLaunchOptionsKey
。
当确定是否发生过境时,系统在发送通知之前等待确定。 具体而言,用户必须在边界上行进最小距离并保持在边界的同一侧至少20秒。 这些条件有助于消除对委托对象方法的错误调用。
LIsting 2
显示了用户输入注册区域时调用的委托方法。 区域具有关联的标识符,该方法使用该标识符来查找与该区域相关的信息并执行相关联的动作。
// Listing 2 Handling a region-entered notification
func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
if let region = region as? CLCircularRegion {
let identifier = region.identifier
triggerTaskAssociatedWithRegionIdentifier(regionID: identifier)
}
}
终止您的应用程序(由用户或系统)并不妨碍它重新启动处理区域边界穿越。 但是,当禁用“后台应用程序刷新”Background App Refresh
时,无论是针对您的应用程序还是所有应用程序,用户都必须明确启动您的应用程序才能恢复所有与位置相关的事件的传送。
后记
未完,待续~~~