StartUpdatingLocation 与重大变化的位置服务

Posted

技术标签:

【中文标题】StartUpdatingLocation 与重大变化的位置服务【英文标题】:StartUpdatingLocation Vs significant-change location service 【发布时间】:2013-01-20 11:18:46 【问题描述】:

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

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

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

【问题讨论】:

当您的位置发生重大变化(可能以米为单位)时,您会收到回调。并且 updatelocation 会每隔一秒或更长时间为您提供回调。 不要坐在系统上等待重大变化。在附近喝杯咖啡,参加重大变革活动。 我同意应该有重大的改变来获得下一个回调,但你不认为它应该在我们启动它时至少出现一次。我的意思是没有什么可以比较是否第一次发生了重大变化? 【参考方案1】:

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

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

详情请查看CLLocationManager

startUpdatingLocation

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

- (void)startUpdatingLocation Discussion

此方法立即返回。调用此方法会导致 位置管理器获取初始位置修复(这可能需要 几秒钟)并通过调用其通知您的代表 locationManager:didUpdateLocations: 方法。 (在 ios 5 及更早版本中, 位置管理器调用 locationManager:didUpdateToLocation:fromLocation: 方法代替。) 之后,接收方主要在 超出了 distanceFilter 属性中的值。更新可能是 但在其他情况下交付。例如,接收机可以 如果硬件收集到更准确的信息,则发送另一个通知 位置读取。

连续多次调用此方法不会自动 导致产生新的事件。在中调用 stopUpdatingLocation 然而,之间确实会导致下一个发送新的初始事件 调用此方法的时间。

如果您启动此服务并且您的应用程序被暂停,则 系统停止传递事件,直到您的应用程序启动 再次运行(在前台或后台)。如果你的 应用程序终止,新位置事件的传递停止 共。因此,如果您的应用程序需要接收位置 在后台的事件,它必须包括 UIBackgroundModes 其 Info.plist 文件中的键(带有位置值)。

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


startMonitoringSignificantLocationChanges

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

- (void)startMonitoringSignificantLocationChanges Discussion

该方法异步发起位置事件的传递, 你打电话后不久就回来了。位置事件被传递到 你的委托的 locationManager:didUpdateLocations: 方法。首先 要传递的事件通常是最近缓存的位置 事件(如果有),但在某些情况下可能是较新的事件。 获取当前位置可能需要几秒钟的时间, 所以一定要检查你的位置事件的时间戳 委托方法。

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

如果您启动此服务并且您的应用程序随后 终止,系统自动重新启动应用程序到 新事件到达时的背景。在这种情况下,选项 字典传递给 locationManager:didUpdateLocations: 方法 您的应用程序委托包含密钥 UIApplicationLaunchOptionsLocationKey 来表明你的 由于位置事件而启动了应用程序。重启后, 您仍然必须配置一个位置管理器对象并调用它 方法继续接收位置事件。当你重新启动 位置服务,当前事件被传递给您的代表 立即地。此外,您所在位置的 location 属性 manager 对象甚至填充了最新的位置对象 在您开始定位服务之前。

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

注意:应用程序可能会在设备移动 500 后立即收到通知 米或更多从其先前的通知。它不应该期望 通知的频率高于每五分钟一次。如果 设备能够从网络中检索数据,位置管理器 更有可能及时发送通知。

【讨论】:

Mithun,我使用的是旧版本的 iOS,而不是 locationManager:didUpdateLocations:,我使用的是 - (void) locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation。我已经阅读了文档,根据这两种类型的定位服务,您接收这些事件的方式是相同的。您提到的方法适用于 iOS 6 及更高版本。从 iOS 4 开始支持我使用的那个。 如果我的应用程序进入后台模式,我的 locationManager: 委托方法不会触发。我已经在 info.plist 中添加了所有必需的键,但仍然没有变化。请分享您对这个问题的看法。我使用 iOS 9.1 和 xcode 7.2 。我正在使用 startUpdatingLocation。 在应用程序中可以同时使用startUpdatingLocationstartMonitoringSignificantLocationChanges吗? @irbanana:是的,但是那有什么用呢?每当发生位置更改时,由于startUpdatingLocation,它将调用委托方法。在这种情况下,使用startMonitoringSignificantLocationChanges 没有意义 @MdRais,您是否已在功能上打开“背景 -> 位置更新”?

以上是关于StartUpdatingLocation 与重大变化的位置服务的主要内容,如果未能解决你的问题,请参考以下文章

同时使用 startUpdatingLocation 和 startMonitoringSignificantChanges?

为啥 LocationManager 会多次调用 startUpdatingLocation?

startUpdatingLocation 不再在 XCode 6.1 中工作

iOS startUpdatingLocation 从未调用过

startUpdatingLocation 仅在 wifi 开启时有效,但仅在 3G 开启时无效

找不到 CLLocationManager startUpdatingLocation