使用CoreLocation重要位置监控时的电池消耗& CoreBluetooth

时间:2012-03-01 08:57:18

标签: ios core-location cllocationmanager power-management core-bluetooth

我们已经发布了一个在后台运行的应用程序并使用了CoreBluetooth& CoreLocation自动保存您的停车位置。

在较高级别,我们的应用只需查找CoreBluetooth断开连接事件并启用GPS,直到我们获得定位(准确度<= 10米)或最长3分钟(这可能会在您停放时发生)一个没有GPS覆盖的地下停车场)。然后,我们使用重要位置监控在系统终止我们的应用程序时自动重新启动我们的应用程序。

在我们的开发过程中,我们自己从未看到过电池耗尽问题,但是75%的用户表示他们看到了大量的电池消耗。 10%的支持者回应了民意调查,因此很难确定故障的代表性,但它占我们用户的很大比例。 http://www.findmycarsmarter.com/forum/viewtopic.php?f=4&t=30

然后,我们发布了一项更新,允许用户禁用重要位置监控,60%的人表示通过禁用重要位置监控,排放消失。 http://www.findmycarsmarter.com/forum/viewtopic.php?f=4&t=42

最初我们无法自己复制排水问题,但我们发现当我们安装一个简单的应用程序时,只需将“重要位置监控”与“查找我的汽车智能”结合使用,我们就会间歇性地看到排水管重现。在排水状态下,手机不会进入休眠状态。这表示即使手机已进入睡眠状态且显示屏已关闭,(设置 - >使用 - >上次完全充电后的时间)中的使用时间也会继续增加。有些东西会阻止系统进入休眠状态。在这个阶段,电池每小时消耗约15%。这种排水间歇地出现,似乎在一两个小时后自行消失,然后再次随机出现。我们还没有找到一种可靠性来重现流失的方法。

我们认为问题是由多个客户调用CoreLocation引起的。我们询问了一些遇到此问题的用户擦拭手机并只安装了我的Find My Car Smarter应用程序。只安装了这个应用程序,排水管没有展出。我们还有其他报告称,当我们的应用与谷歌纵横或Facebook等一起使用时,他们会看到流失。或者如果他们去杀死其他应用程序,那么排水管就会消失。我们已经看到,在没有应用程序启动的情况下,耗电会持续通过电源循环。这意味着它必须是一个系统级服务,以防止操作系统休眠。

尽管我们认为问题是由多个客户调用CoreLocation的竞争条件引起的,但我们从未看到使用CoreLocation的应用程序重现问题。我们甚至创建了4个或5个不同的应用程序,这些应用程序将同时访问CoreLocation,但我们没有看到排放发生。然而,当我们有一个带有CoreLocation的应用程序和带有CoreLocation + CoreBluetooth的第二个应用程序时,我们确实看到了这个问题。可能很少有应用程序使用CoreLocation + CoreBluetooth组合,因此可能导致更多开发人员无法解决此问题。虽然我们不知道如何解释CoreLocation&amp; CoreBluetooth交互导致这种消耗以及CoreLocation的第二个应用程序如何进入等式。由于排水是间歇性的,因此只有在我们使用CoreLocation + CoreBluetooth进行测试时才会出现这种问题。

在仅有这两个应用CTM1&amp;的擦除5.0.1 iPhone 4S上安装了FMC,我们能够间歇性地进入排水状态。有趣的是,在我们的普通设备上,擦除设备上的排水问题似乎发生的频率要低得多。不幸的是,我们只看了几次排水状态而没有能够可靠地再现排水管,我们没有一个良好的控制状态可供使用。

我们已经向Apple提交了一份错误报告并开辟了技术支持事件,但也许Stackover社区也可以提供一些见解。我们在5.0.1&amp ;;中看到了这个问题。在5.1 Beta 3中。

CTM1 http://www.findmycarsmarter.com/files/CTM1.zip

On Going into the Background
    [locationManager stopUpdatingLocation];
    [locationManager stopUpdatingHeading];
    [locationManager startMonitoringSignificantLocationChanges];

On Re-entering Foreground
    [locationManager stopMonitoringSignificantLocationChanges];
    [locationManager startUpdatingLocation];
    [locationManager startUpdatingHeading];
On didUpdateToLocation
    //do nothing
On didUpdateHeading
    //do nothing

FMC http://www.findmycarsmarter.com/files/FMC.zip

On Going into the Background
    [btleManager stopScan];
    [locationManager stopUpdatingLocation];
    [locationManager stopUpdatingHeading];
    [locationManager startMonitoringSignificantLocationChanges];

On Re-entering Foreground
    [locationManager stopMonitoringSignificantLocationChanges];
    [locationManager startUpdatingLocation];
    [locationManager startUpdatingHeading];        
    [btleManager scanForPeripheralsWithServices:nil options:nil];
On didUpdateToLocation
    //do nothing
On didUpdateHeading
    //do nothing
On centralManagerDidUpdateState
    [btleManager scanForPeripheralsWithServices:nil options:nil];
On didDiscoverPeripheral
    [btleManager connectPeripheral:device options:nil];
On didConnectPeripheral
    //update log
On didDisconnectPeripheral
    //initiate reconnect
    [btleManager connectPeripheral:device options:nil];

如果您发现可能导致排放的编码错误,请告诉我们。

如果我们同时使用GPS和GPS,我们会遇到另外一个问题。重要的位置监控,是否有理由拨打stopMonitoringSignificantLocationChanges?查看Regions示例代码,他们称之为stopMonitoringSignificantLocationChanges&amp; startLocationUpdate进入前景stopLocationUpdate&amp; startMonitoringSignificantLocationChanges进入后台,但我想知道这是否必要/推荐/需要?

更新

我们已经向Apple开发者技术支持部门确认,对于同时使用GPS和GPS的应用程序重要位置监控我们在启用GPS更新之前关闭重要位置监控的顺序是正确的。

我们也确认了排放问题仍然可以在GM 5.1&amp;使用针对5.1框架重新编译的Find My Car Smarter应用程序。

更新

当我们的应用程序从后台启动以响应重要位置监控事件时,似乎会触发此问题。实际上,我们在示例代码中没有正确处理这种情况,但我们在实际的应用程序中进行了处理。

在示例代码中,在后台重新启动时,我们将启用位置更新,并且由于没有applicationDidEnterBackground呼叫,GPS将保持打开状态。

在我们的应用程序中,我们检查是否通过查找UIApplicationLaunchOptionsLocationKey标志从后台启动,如果是,我们启动重要位置监控,否则我们在前台启动并开始更新位置。

Apple回复我们并表示使用重要位置监控不需要在Info.plist中的UIBackgroundModes数组中设置位置。我们删除了此条目,似乎电池耗电状态不再受到影响。我们在UIBackgroundModes列表中仍然有蓝牙中心。目前我们还不清楚为什么这会有所帮助。我们将开展更多实验,以帮助我们更好地理解这一点。如果有人有任何建议,请告诉我们。

3 个答案:

答案 0 :(得分:17)

在一天结束时,Apple建议从UIBackgroundModes移除位置修复我们的电池耗尽问题。

为了仍然在后台获取位置,我们必须包裹[locationManager startLocationUpdates]&amp; [locationManager stopLocationUpdates]拨打电话:

[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler];
[[UIApplication sharedApplication] endBackgroundTask:];

答案 1 :(得分:2)

您可以使用任何重复的信号声音调试应用的状态。请确保您没有在此测试的后台模式要求中添加“播放音频”。 如果您的应用程序正在运行 - 即使应用程序在后台,您也会听到这种声音。如果应用被暂停 - 你什么也听不到。这可能是检测应用程序未正确暂停的最简单方法。

使用Profiler调试此问题是有问题的,因为当设备连接到计算机时,许多事情在调试模式下有所不同。特别是省电的东西。

此外,请确保您做出正确的选择,以应对重大的地理位置变化。如果您开始更新位置 - 请确保您设置了一些关闭位置更新的计时器(例如3分钟)。 无论如何,iOS会杀死你的应用程序,即使它从响应重大位置更改开始位置更新。无论你在响应中做了什么 - 如果仍在运行,应用程序将在10分钟后被杀死 - 注意崩溃日志 - 此类事件将被记录在那里。

此外,检查所有第三方代码和库 - 可能其中一些转为GPS并将其用于某些事情。主要是偏执狂,但可能会出于分析和广告定位的目的。

答案 2 :(得分:0)

CoreLocation启用的应用程序通常用于后台模式,因此它可以在后台运行,绝对是使用更多的电池,因为我的建议总是尝试在不需要时停止位置服务。

[locationManager stopUpdatingLocation];

然后根据您的要求然后相应地开始,

谢谢