应用程序终止时,位置服务不会停止

时间:2011-09-14 08:01:26

标签: iphone ios ipad core-location iphone-4

我目前正在开发一个iPhone应用程序,它需要各种用途的位置服务,包括AR。

我在模拟器和iPhone 3GS上测试一切,一切顺利。

我最近在iPhone4和iPad2上进行了测试,即使我手动杀死应用程序,位置服务(状态栏中的小图标)仍然显示! 禁用此图标的唯一方法是在设置中手动停止我的应用的位置服务。

有人对此有所了解吗? 如果需要,我可以发布我的代码。

提前谢谢

编辑:

当我终止应用程序时,转到位置服务,关闭我的应用程序,位置图标消失。但是当我重新打开它时,它会重新出现!这是正常的吗?

7 个答案:

答案 0 :(得分:8)

我找到了答案!它来自我之前启用的区域监控,但在几周前删除了使用它的所有代码。

由于我已经在iPad上测试过,即使我删除并重新安装了应用程序,系统似乎也保留了我监控的区域信息。

因此,正如documentation所述,iOS继续定位我的应用程序,就像startMonitoringSignificantLocationChanges一样。

感谢您的回答,它让我更好地了解了定位系统以及如何有效地使用它(特别感谢progrmrBill Brasky

答案 1 :(得分:7)

听起来你是应用程序进入后台并仍在使用CLLocation。当您收到应用程序正在退出活动的通知时,您可以停止CLLOcationManager,这是最好的方法。然后在它变为活动状态时恢复。这个问题的答案显示了如何做到here

[编辑]当您的应用程序进入后台或因任何原因(例如:电话)暂停时,您应该停止当时的位置服务。您需要订阅通知并提供停止和启动位置服务的方法,如下所示:

-(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];
}

答案 2 :(得分:2)

使用区域监控工具时遇到了同样的问题。我做了什么来禁用区域并不重要,箭头仍然存在。我最终通过清理对locationManager的调用来解决问题。如果您要关闭视图但不需要位置管理器,请将其设置为nil和/或将其释放。如果您在后台监控位置,它将保持在那里,但如果没有,请确保您正在清理所有位置监控。

这似乎是一个错误,但正如我发现的那样,它不是。只需要更多清理。

答案 3 :(得分:2)

我一直在与这个问题作斗争,我想我终于深究了它..

当您提出要求时,位置服务不会停止的原因不是因为您没有停止或正确释放它。根据我的经验,它实际上是由释放和重新分配CLLocationManager本身引起的。

如果您的代码在applicationDidEnterBackground中释放CLLocationManager,然后在applicationDidEnterForeground等中分配一个全新的CLLocationManager,那么您可能会遇到此问题。

解决方案是:

  1. 仅在applicationDidFinishLaunching中创建一次CLLocationManager对象。
  2. 首先,正常调用startUpdatingLocation,startMonitoringSignificantLocationChanges等。
  3. 要停止更新,请正常调用相应的stopUpdatingLocation,stopMonitoringSignificantLocationChanges等。
  4. 永远不要释放你的CLLocationManager或将它的'引用设置为nil(可能在applicationWillTerminate中除外,但这可能不会有任何区别)。
  5. 通过这种方式,我将应用程序放在后台后,让我的应用程序继续使用位置服务长达12小时,使用这种新方法在10秒内消失了位置服务箭头。

    注意:在运行iOS 5.1.1的iPhone 4S上测试。要在这方面获得应用程序性能的准确结果,请确保进入“设置” - >“位置服务” - >“系统服务”并关闭状态栏图标开关。这样,状态栏箭头将准确反映应用程序的使用情况。

答案 4 :(得分:1)

据推测,这是因为用户不需要盯着酒吧注意到一些恶作剧应用正在使用位置服务。当您使用任何位置服务时,该图标会出现,并在之后的某些不确定时间内保留。

这是故意行为Apple希望用户知道哪些应用正在使用他们的位置。看来这是敏感数据,你不同意吗?

答案 5 :(得分:1)

这是解决这个问题的解决方案。

暂停

中的监控位置更改
- (void) applicationDidEnterBackground: (UIApplication *)application
{
    [locationManager stopMonitoringSignificantLocationChanges];
    locationManager.delegate = nil;
}

不在applicationWillEnterForeground:。但是,消失定位图标需要几秒钟。

我不知道为什么它不适用于后一种方法。

答案 6 :(得分:0)

我刚刚遇到这个问题,发现只应用applicationDelegate对象的一种方法很有用

- (void)applicationWillEnterForeground:(UIApplication *)application;

如果您阻止CLLocationManager在该通话中接收更新,您就可以了。当然,您需要在其他地方开始更新,- (void)applicationDidBecomeActive:(UIApplication *)application;将是一个不错的选择。您还需要注意,有两种位置感知方法

  • 基于gps的-(void)start/stop_UpdatingLocation;

  • 以及基于3g / wi-fi的-(void)start/stop_MonitoringSignificantLocationChanges;