【问题标题】:Location services don't stop when application is terminated应用程序终止时位置服务不会停止
【发布时间】:2011-11-16 19:17:24
【问题描述】:

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

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

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

有人知道吗? 如果需要,我可以发布我的代码。

提前谢谢你

编辑:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这解决了我的问题。我删除了一些重要的更改监控,但位置监控似乎仍然处于活动状态。在设置中重置位置通知为我修复了这个错误。
    • 我只是浪费了几个小时来跟踪具有重大变更服务的相同“功能”。正如您在区域监控中描述的那样,我在几个版本前删除了重大更改服务,完全卸载并重新安装了该应用程序,当我在应用程序的当前版本上打开标准位置服务,然后将其关闭时,位置服务图标会一直亮着。显然,尽管卸载了应用程序,但重大更改设置仍然存在。我刚刚打电话给stopMonitoringSignificantLocationChanges 一次,现在一切都很好。哇,真令人沮丧。
    • 是的,感谢 Apple 提供了良好的框架 :) irony 你测试的是哪个 iOS 版本?可以很好地填充雷达
    【解决方案2】:

    听起来您的应用正在进入后台并仍在使用 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];
    }
    

    【讨论】:

    • 感谢您的回答,我在定位器的 dealloc 方法中添加了 CLLocationManager stopMonitoringSignificantLocationChanges,但它仍然不起作用!
    • dealloc 不是正确的地方。您需要订阅通知。我在回答中添加了更多细节。
    • 再次感谢,我已经实现了你的方法,但这仍然行不通!我添加了一些日志,并在适当的时候调用了这些方法,但应用程序一直在定位
    • 你怎么知道它一直在定位?我对此表示怀疑。尝试从底部的应用历史滑块中杀死它。
    • 这就是我所做的......而且我知道它会一直定位,因为本地化指示器会一直显示
    【解决方案3】:

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

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

    【讨论】:

    • 检查您设置了 的所有位置。它们将是您的位置监控的地方。
    【解决方案4】:

    我一直在与这个问题作斗争,我想我终于找到了问题的根源..

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

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

    解决办法是这样的:

    1. 只在 applicationDidFinishLaunching 中创建一次 CLLocationManager 对象。
    2. 要开始,请照常调用 startUpdatingLocation、startMonitoringSignificantLocationChanges 等。
    3. 要停止更新,请照常调用相应的 stopUpdatingLocation、stopMonitoringSignificantLocationChanges 等。
    4. 永远不要释放您的 CLLocationManager 或将其引用设置为 nil(可能在 applicationWillTerminate 中除外,但这可能不会产生任何影响)。

    通过这种方式,我的应用在将我的应用置于后台后继续使用定位服务长达 12 小时,而通过这种新方法,定位服务箭头在后台运行后 10 秒内消失。

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

    【讨论】:

      【解决方案5】:

      大概是这样,用户无需盯着栏即可注意到某些恶作剧的应用正在使用位置服务。该图标会在您使用任何定位服务时出现,之后会持续一段时间。

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

      【讨论】:

      • 图标不会保留“一些不确定的时间”。只要使用位置,它就会一直存在。停止后,图标立即消失。
      【解决方案6】:

      这是为我解决此问题的解决方案。

      停止监控位置变化

      - (void) applicationDidEnterBackground: (UIApplication *)application
      {
          [locationManager stopMonitoringSignificantLocationChanges];
          locationManager.delegate = nil;
      }
      

      不在applicationWillEnterForeground: 中。不过,定位图标需要几秒钟才能消失。

      我不知道为什么它在后一种方法中不起作用。

      【讨论】:

      • 为什么我不能?您标记的回答对您有用,并不意味着它绝对适用于其他人。我的帖子可能对您没有用,其他人可能会觉得这篇文章有用。
      • 我同意你的观点,但你没有给出新的答案,因为你说的已经在以前的帖子中了:)
      【解决方案7】:

      我前段时间遇到过这个问题,发现只应用applicationDelegate对象的一种方法很有用

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2014-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-10
        • 1970-01-01
        • 2023-04-03
        相关资源
        最近更新 更多