应用程序终止时,位置服务不会停止
我目前正在开发一个iPhone应用程序,需要包括AR在内的各种使用的位置服务。
我在模拟器和iPhone 3GS上testing了一切,一切都很顺利。
我最近在iPhone4和iPad2上进行testing,即使手动杀死应用程序,位置服务(状态栏中的小图标)也会一直显示。 禁用此图标的唯一方法是在设置中手动停止我的应用的位置服务。
有没有人知道这件事? 如果需要,我可以发布我的代码。
先谢谢你
编辑:
当我杀了应用程序,去定位服务,关掉我的应用程序的位置图标消失。 但是当我重新打开它时,它又重新出现了! 这是正常的吗?
我find了答案! 它来自于我之前启用的区域监视,但几周前删除了所有代码。
就像我已经在iPad上testing过的一样,即使我删除并重新安装了应用程序,系统似乎也保留了我监控区域的信息。
因此,正如文档所描述的,iOS一直在为我的App定位,就像startMonitoringSignificantLocationChanges一样。
感谢您的回答,这让我更好地了解了位置系统以及如何有效地使用它(特别感谢程序员和Bill Brasky )
听起来就像你的应用程序正在进入后台,仍然使用CLLocation。 当您收到通知您应用程序正在退出活动状态时,您可以停止CLLOcationManager,这是最好的方法。 然后恢复时,它变得活跃。 这个问题的答案显示了如何在这里做到这一点
[编辑]当你的应用程序进入后台或由于任何原因而辞职(即:电话),你应该停止当时的位置服务。 您需要订阅通知并提供停止和启动位置服务的方法,如下所示:
-(void)appDidBecomeActiveNotif:(NSNotification*)notif { [locationManager startUpdatingLocation]; } -(void)appWillResignActiveNotif:(NSNotification*)notif { [locationManager stopUpdatingLocation]; } -(void)viewDidLoad { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appDidBecomeActiveNotif:) name:UIApplicationDidBecomeActiveNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillResignActiveNotif:) name:UIApplicationWillResignActiveNotification object:nil]; } -(void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; [super dealloc]; }
在使用区域监视工具时遇到了同样的问题。 我做了什么来禁用这个地区并不重要,箭头依然存在。 我终于通过清理对locationManager的调用来解决问题。 如果您正在closures视图并且不需要位置pipe理器,请将其设置为零并/或释放它。 如果您在后台监控位置,它将保持在那里,但如果没有,请确保您正在清理所有位置监控。
看来这是一个错误,但是我发现它并不是。 只是需要更多的清理。
我一直在和这个问题作斗争,而且我想我终于明白了。
定位服务不停止的原因不是因为您没有停止或正确释放。 这实际上是由我的经验释放和重新分配CLLocationManager本身。
如果你有代码在applicationDidEnterBackground中释放你的CLLocationManager,然后你在applicationDidEnterForeground等中分配一个新的,那么你可能会遇到这个问题。
解决方法是这样的:
- 在applicationDidFinishLaunching中只创build一次你的CLLocationManager对象。
- 要开始,像平常一样调用startUpdatingLocation,startMonitoringSignificantLocationChanges等。
- 要停止更新,请照常调用相应的stopUpdatingLocation,stopMonitoringSignificantLocationChanges等。
- 永远不要释放你的CLLocationManager或者把它的引用设置为零(除了可能在applicationWillTerminate中,但可能没有任何区别)。
通过这种方式,我的应用程序继续使用位置服务长达12小时后,将我的应用程序放在后台,到位置服务箭头在10秒内消失后,使用这种新方法。
注意:testing运行iOS 5.1.1的iPhone 4S。 要在这方面获得准确的应用程序性能结果,请确保进入设置 – >位置服务 – >系统服务并closures状态栏图标开关。 这样,状态栏箭头将准确地反映应用程序的使用情况。
据推测,这是用户不需要盯着酒吧注意到一些恶作剧的应用程序正在使用的位置服务。 当您使用任何位置服务时会出现该图标,之后会保留一些不确定的时间。
这是苹果希望用户知道哪些应用正在使用其位置的故意行为。 看来这是敏感数据,你不同意吗?
这是为我解决这个问题的解决scheme。
只需停止监视位置更改
- (void) applicationDidEnterBackground: (UIApplication *)application { [locationManager stopMonitoringSignificantLocationChanges]; locationManager.delegate = nil; }
不在applicationWillEnterForeground:
然后,消失定位图标需要几秒钟的时间。
我不知道为什么它不是用后一种方法工作的。
我刚才遇到这个问题,发现只applicationDelegate
对象的一个方法是有用的
- (void)applicationWillEnterForeground:(UIApplication *)application;
如果你停止你的CLLocationManager
接收这个调用中的更新,你会没事的。 当然,你需要开始更新别的地方, - (void)applicationDidBecomeActive:(UIApplication *)application;
将是一个不错的select。 还需要注意的是,有两种位置感知方法
-
基于gps的
-(void)start/stop_UpdatingLocation;
-
和基于3g / wi-fi的
-(void)start/stop_MonitoringSignificantLocationChanges;