4

我遇到了有关重大更改位置服务的问题。

Apple 文档说:“无论您使用标准定位服务还是重大变化定位服务来获取定位事件,您接收这些事件的方式都是相同的。”

但是在“重大变化的位置服务”的情况下,我无法获得在“标准位置服务”的情况下得到的任何回调如果有人有任何意见,请告诉我?

4

1 回答 1

8

startUpdatingLocation第一次调用时更新位置,然后当距离过滤器值超过时更新位置。

但是startMonitoringSignificantLocationChanges当位置发生重大变化时。

详情请查看CLLocationManager

开始更新位置

开始生成报告用户当前位置的更新。

- (void)startUpdatingLocation Discussion

此方法立即返回。调用此方法会导致位置管理器获取初始位置修复(可能需要几秒钟)并通过调用其 locationManager:didUpdateLocations: 方法通知您的委托。(在 iOS 5 和更早的版本中,位置管理器调用 locationManager:didUpdateToLocation:fromLocation: 方法。)之后,接收器主要在超过 distanceFilter 属性中的值时生成更新事件。不过,可能会在其他情况下提供更新。例如,如果硬件收集到更准确的位置读数,接收器可能会发送另一个通知。

连续多次调用此方法不会自动生成新事件。但是,在这两者之间调用 stopUpdatingLocation 确实会在您下次调用此方法时发送一个新的初始事件。

如果您启动此服务并且您的应用程序被挂起,系统将停止传递事件,直到您的应用程序再次开始运行(无论是在前台还是在后台)。如果您的应用程序终止,则新位置事件的传递将完全停止。因此,如果您的应用程序需要在后台接收位置事件,它必须在其 Info.plist 文件中包含 UIBackgroundModes 键(带有位置值)。

除了实现 locationManager:didUpdateLocations: 方法的委托对象外,它还应该实现 locationManager:didFailWithError: 方法以响应潜在错误。


startMonitoringSignificantLocationChanges

根据重大的位置变化开始生成更新。

- (void)startMonitoringSignificantLocationChanges Discussion

此方法以异步方式启动位置事件的传递,并在您调用它后立即返回。位置事件被传递到您的委托的 locationManager:didUpdateLocations: 方法。要传递的第一个事件通常是最近缓存的位置事件(如果有),但在某些情况下可能是较新的事件。获取当前位置修复可能需要几秒钟的时间,因此请务必检查委托方法中位置事件的时间戳。

在返回当前位置定位后,接收器仅在检测到用户位置发生重大变化时才生成更新事件。例如,当设备与不同的蜂窝塔相关联时,它可能会生成一个新事件。它不依赖 distanceFilter 属性中的值来生成事件。连续多次调用此方法不会自动生成新事件。但是,在这两者之间调用 stopMonitoringSignificantLocationChanges 确实会在您下次调用此方法时发送一个新的初始事件。

如果您启动此服务并且您的应用程序随后终止,则系统会在新事件到达时自动将应用程序重新启动到后台。在这种情况下,传递给应用程序委托的 locationManager:didUpdateLocations: 方法的选项字典包含键 UIApplicationLaunchOptionsLocationKey 以指示您的应用程序是由于位置事件而启动的。重新启动后,您仍然必须配置位置管理器对象并调用此方法以继续接收位置事件。当您重新启动位置服务时,当前事件会立即传递给您的委托。此外,即使在您启动位置服务之前,您的位置管理器对象的位置属性也会填充最新的位置对象。

除了实现 locationManager:didUpdateLocations: 方法的委托对象外,它还应该实现 locationManager:didFailWithError: 方法以响应潜在错误。

注意:一旦设备从之前的通知移动 500 米或更远,应用程序就会收到通知。它不应期望通知的频率超过每五分钟一次。如果设备能够从网络检索数据,则位置管理器更有可能及时传递通知。

于 2013-02-05T13:58:44.673 回答