29

我的应用程序需要在后台跟踪用户位置的变化,只要用户四处走动就可以正常工作。CLLocationManager当用户在 10-20 分钟左右后停止并暂停时。此通知表明:

-(void)locationManagerDidPauseLocationUpdates:(CLLocationManager *)manager{}

这对我来说也很好。太好了,我节省了一些电池等。

问题是CLLocationManager当用户再次开始移动时永远不会醒来,并且在我将应用程序置于前台(激活)之前,永远不会触发以下委托方法:

//Never called back after CLLocationManager pauses:
-(void)locationManagerDidResumeLocationUpdates:(CLLocationManager *)manager{}
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{}

为什么locationManagerDidResumeLocationUpdates设备再次开始移动后从不调用?GPS不应该也自动恢复(因为自动暂停)? 有没有办法在没有用户交互的情况下恢复 GPS?

应用程序在 Info.plist 文件中声明了以下内容:

在此处输入图像描述

我的 CLLocationManager 设置是:

locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
[locationManager setActivityType:CLActivityTypeFitness];
//I WANT pauses to save some battery, etc... That is why following line is commented out (default)
 //[locationManager setPausesLocationUpdatesAutomatically:NO];
 locationManager.distanceFilter = kCLLocationAccuracyNearestTenMeters;
 locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
 [locationManager startUpdatingLocation];
4

3 回答 3

31

如果您在 Apple 论坛上搜索,pausesLocationUpdatesAutomatically您会发现最近的一个类似问题的问题,该问题得到了 Apple 开发人员的回复。因为它是一个私人论坛,所以我不会直接在这里转发它,但要点是位置暂停是因为用户忘记了他们正在运行一个位置感知应用程序并停止使用它。通过暂停更新,他们的电池不会很快耗尽。不幸的是,无法知道新动作是他们恢复活动还是做其他事情,因此在应用程序回到前台之前不会恢复更新。他们的建议是抓住暂停呼叫并以某种方式引起用户的注意,以便在他们仍然想要更新时让他们打开应用程序。

编辑:

来自 Apple 自己的pausesLocationUpdatesAutomatically文档。他们建议:

发生暂停后,有责任在确定需要定位服务时再次重新启动它们。Core Location 调用locationManagerDidPauseLocationUpdates(_:) 您的位置管理器委托的方法,让您知道发生了暂停。在该方法中,您可以配置一个本地通知,其触发器类型 UNLocationNotificationTrigger 为当用户退出当前区域时设置为通知。本地通知消息应提示用户再次启动您的应用程序,以便它可以恢复更新。

于 2013-07-15T13:27:12.777 回答
3

苹果文档在该主题上非常薄弱。属性pausesLocationUpdatesAutomatically允许苹果在苹果认为用户不需要 GPS 时关闭 GPS。

虽然没有记录,但似乎设置此属性会导致 GPS 在后台模式下停止。

各种帖子描述了该属性的问题:,例如这里:
iOS 6 CoreLocation does not work

iOS 6 中 AutoPause 不起作用 Stanislav Dvoychenko 发布了 Apple 的推荐:

[更新 - 2013 年 3 月 4 日]。我查看了 Apple 关于 iOS6 中位置更改的演示文稿,他们建议在收到区域更改事件后使用区域更改监控来“取消暂停”。虽然这不适合我的场景,因为用户可能会去/跑步/开车一两公里,直到发生这样的事件。

我建议:将该属性设置为 false。

于 2013-07-07T08:43:48.567 回答
1

如果可以,请使用 startMonitoringSignificantLocationChanges,因为那时(Apple):

如果您启动此服务并且您的应用程序随后终止,则系统会在新事件到达时自动将应用程序重新启动到后台。

一旦您的应用程序唤醒(例如用户重新进入它),您可以尝试将此与更细粒度的跟踪结合起来。

于 2013-07-13T12:24:40.210 回答