区域半径
请查看有关的讨论启动区域监控请注意,Apple 表示该区域的值最大为 400,在后续设备上效果最佳。他们还指出,平均可以在 3 到 5 分钟内得到回复。我不确定您如何测试该区域的进入/退出,但可能您没有留出足够的时间通过。
区域监控
此外,我建议您设置断点来检查监控区域代码中战略点处的 CLLocationManager 属性(当您期望区域更新时)。您可能会考虑清空区域数组(请参阅即:标题如下),然后使用您的自定义代码重新填充它们。我会非常仔细地检查该区域,以确保预期的行为正在发生。
Filters
有许多过滤器可以通知 CLLocationManager 位置何时发生重大变化。您应该设置这些值并检查它们是否对更新频率有影响。另请注意我展示的其他属性和方法,包括期望准确度以及启动重大更新的方法。阅读每个内容的讨论,看看它们是否适用于您的用例。尝试在需要时应用更改,以强制设备在适合您的情况时进行更新。
命中测试用户位置
您可能希望使用用户位置对特定 CLCircularRegion 实施定期命中测试。这应该允许您在代码中的预定时间/位置进一步细化位置更新。例如,您可能希望使用精度和距离过滤器来细化用户更新,然后在委托方法中调用针对数组中最近区域的查询。最终效果是,只要设备从最后一个已知位置显着移动,就会强制执行区域状态检查。
位置变更的后台更新
我建议您仔细阅读与此相关的讨论开始监控重大位置变化 https://developer.apple.com/library/ios/documentation/CoreLocation/Reference/CLLocationManager_Class/index.html#//apple_ref/occ/instm/CLLocationManager/startMonitoringSignificantLocationChanges方法(您必须使用此方法来解决问题)。 Apple 详细介绍了当应用程序在后台运行时获取更新所需的步骤。基本上,您必须拦截应用程序委托方法中的一个键。幸运的是这个所以问题 https://stackoverflow.com/questions/27742677/how-to-get-location-updates-for-ios-7-and-8-even-when-the-app-is-suspended有示例代码。但在跳转到代码之前,请按照建议查看讨论,因为它会让您更清楚地了解如何掌握此行为。
部分答案
就像很多问题一样。这个问题需要一些部分答案来解决您需要的功能。首先确保您已检查上面提供的注释,然后尝试其中一些链接以获得特定所需任务的部分答案。
如何禁用使用 -startMonitoringForRegion 注册的任何 CLRegion 对象? https://stackoverflow.com/questions/7061007/how-can-i-disable-any-clregion-objects-registered-with-startmonitoringforregion#dash-score-16
Namely:
关于如何完善地理围栏的有用回复 https://stackoverflow.com/questions/23866097/ios-geofence-clcircularregion-monitoring-locationmanagerdidexitregion-does-not
地理围栏简化教程 http://shrikar.com/swift-tutorial-corelocation-and-region-monitoring-in-ios-8/
(你用过吗请求始终授权()在位置管理器上?)
诺塔·贝尼
我建议您阅读有关方法和属性的讨论,以了解 Apple 的提示。您还应该随意在代码编辑器中按住 cmd 键单击方法和属性,并查看头文件中的注释。这些将提供 Apple 提供的文档或快速帮助中未提供的更多见解。
作为一个简单的例子,以下标题注释似乎与您的目标相关。您可能想要实现并监视注释标题中提到的委托方法和 requestStateForRegion 方法:
/*
* locationManager:didDetermineState:forRegion:
*
* Discussion:
* Invoked when there's a state transition for a monitored region or in response to a request for state via a
* a call to requestStateForRegion:.
*/
@available(iOS 7.0, *)
optional public func locationManager(manager: CLLocationManager, didDetermineState state: CLRegionState, forRegion region: CLRegion)