StartUpdatingLocation与significant-change location service的区别

4

我遇到了关于显著位置变化服务的问题。

苹果文档中提到:“无论您使用标准位置服务还是显著位置变化服务来获取位置事件,接收这些事件的方式都是相同的。”

但是在“显著位置变化服务”的情况下,我无法像在“标准位置服务”中那样获得任何回调。请问是否有人有任何建议?


这是因为当您的位置发生重大变化时,您会收到回调,这可能是以米为单位的。而updateLocation将在每秒或更长时间内给您回调。 - Dilip Manek
不要坐在系统旁等待重大变化。准备好一杯咖啡,获取重大变化事件。 - Inder Kumar Rathore
我同意需要有显著的变化才能得到下一个回调,但是你不认为我们启动它时至少应该出现一次吗?我的意思是没有什么可以比较是否第一次发生了显著的变化。 - Sagrian
1个回答

8

startUpdatingLocation 方法在第一次调用时会更新位置信息,之后当距离过滤器的值超过时也会更新。

startMonitoringSignificantLocationChanges 方法则是在位置发生显著变化时更新。

请查看CLLocationManager获取更多细节信息。

startUpdatingLocation

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

- (void)startUpdatingLocation Discussion

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

连续调用此方法多次不会自动生成新事件。但是,在两次调用之间调用stopUpdatingLocation会导致在下次调用此方法时发送新的初始事件。

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

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


开始基于重大位置变化生成更新。此方法异步启动位置事件传递,您调用它后不久即可返回。位置事件将传递到委托的locationManager:didUpdateLocations:方法中。通常,要传递的第一个事件是最近缓存的位置事件(如果有),但在某些情况下可能是更新的事件。获取当前位置修复可能需要几秒钟的时间,因此请务必在委托方法中检查位置事件的时间戳。
返回当前位置修复后,接收器仅在检测到用户位置的重大更改时生成更新事件。例如,当设备与不同的蜂窝塔相关联时,它可能会生成新事件。它不依赖于distanceFilter属性的值来生成事件。多次连续调用此方法不会自动导致生成新的事件。但是,在两次调用之间调用stopMonitoringSignificantLocationChanges会导致在下一次调用此方法时发送新的初始事件。
如果启动此服务并随后终止应用程序,则系统会自动将应用程序重新启动到后台,如果有新事件到达。在这种情况下,传递给应用程序委托的locationManager:didUpdateLocations:方法的选项字典包含UIApplicationLaunchOptionsLocationKey键,以指示由于位置事件而启动了应用程序。重新启动后,您仍然必须配置位置管理器对象并调用此方法以继续接收位置事件。重新启动位置服务后,当前事件将立即传递给您的委托。此外,在启动位置服务之前,位置管理器对象的位置属性将填充最近的位置对象。
除了委托对象实现locationManager:didUpdateLocations:方法外,它还应该实现locationManager:didFailWithError:方法来响应潜在错误。
注意:应用程序可以期望在设备从其上一个通知移动500米或更多时立即收到通知。不应该期望频率超过每五分钟一次的通知。如果设备能够从网络检索数据,则位置管理器更有可能及时交付通知。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接