【问题标题】:Core Location: toggle startMonitoringSignificantLocationChanges down from kCLDistanceFilterNone核心位置:从 kCLDistanceFilterNone 向下切换 startMonitoringSignificantLocationChanges
【发布时间】:2012-03-04 03:37:36
【问题描述】:

为了节省电量,我会监控位置更新以查看用户是否已经静止了一段时间;如果是这样,我将 CLLocationManager 从其主要设置 kCLLocationAccuracyBestForNavigation 和 kCLDistanceFilterNone(最大设置)降级为仅监控重大位置变化。

问题是,它不起作用:在调用 startMonitoringSignificantLocationChanges 之后,位置更新继续以高速率涌入,就像调用之前一样。

你如何结束活动然后再次备份?

更新:这段代码回答了这个问题:

        //Set
        if ( shouldMonitorSignificantChangeUpdates ) {
            NSLog(@"Entering -> significant change mode");
            [self.locationManager stopUpdatingLocation];
            [self.locationManager startMonitoringSignificantLocationChanges]; //aka stop monitoring every location change
        } else {
            NSLog(@"Exiting <- significant change mode");
            [self.locationManager stopMonitoringSignificantLocationChanges]; //aka begin monitoring every location change
            [self.locationManager startUpdatingLocation];
        }

【问题讨论】:

  • 你如何测试这个?通过记录设备通过检测蜂窝塔 ID (GSM) 的变化来确定存在显着的位置变化。也可以查看stackoverflow.com/questions/8290707/…
  • 是的,看来我没有让塔改变,所以从来没有得到更新,错误地假设整个系统都被禁用了。

标签: iphone core-location


【解决方案1】:

来自文档:

startMonitoringSignificantLocationChanges 不依赖 distanceFilter 属性中的值来生成事件

不要使用startMonitoringSignificantLocationChanges,而是使用计时器来停止和启动位置更新。

您也可以尝试关闭位置更新,然后使用 startMonitoringSignificantLocationChanges 将其重新打开。不要忘记,这将使系统在检测到重大位置更改时终止后启动您的应用程序。看起来这不是你真正想要的。

【讨论】:

  • 出于各种原因,使用计时器通常是最后的手段。您的第二个建议虽然基本上是我想要完成的,但似乎发布的代码实际上 确实 做到了这一点。谢谢。
【解决方案2】:

实际上,问题中编辑的代码确实有效。它允许系统根据需要从“恒定位置流”到“偶尔更新”来回切换。

我认为我最初的测试不够激进,文档并没有真正讨论使用这两种技术,而是想象一个只需要导航或重大更改的应用程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多