【发布时间】:2012-03-19 18:32:58
【问题描述】:
我们发布了一个在后台运行的应用程序,它使用CoreBluetooth 和CoreLocation 自动保存您的停车位置。
在高层次上,我们的应用只查找CoreBluetooth 断开连接事件并打开 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
最初我们无法自己复制排水问题,但我们发现,当我们安装一个简单的应用程序时,它刚刚打开了重要位置监控以及 Find My Car Smarter,我们间歇性地看到排水问题重现。在排水状态下,手机不会进入休眠状态。这由(设置->使用->自上次完全充电以来的时间)中的使用时间指示,即使手机已进入睡眠状态且显示屏关闭,也会继续增加。有些东西阻止系统进入休眠状态。在这个阶段,电池每小时消耗大约 15%。这种排水断断续续地出现,似乎在一两个小时后自行清除,然后随机再次出现。我们还没有找到可靠再现流失的方法。
我们认为该问题是由多个客户端调用 CoreLocation 引起的。我们要求一些遇到此问题的用户擦除他们的手机并仅安装我们的 Find My Car Smarter 应用程序。仅安装此应用程序,排水管就没有表现出来。我们有其他报告称,当我们的应用程序与谷歌纵横或 Facebook 等一起使用时,他们会看到出现流失。或者,如果他们去杀死其他应用程序,流失就会消失。我们已经看到在电源循环中持续消耗,没有启动任何应用程序。这意味着它必须是防止操作系统休眠的系统级服务。
尽管我们认为该问题是由多个客户端调用 CoreLocation 的某种竞争条件引起的,但我们从未发现仅使用 CoreLocation 的应用会重现该问题。我们甚至创建了 4 或 5 个不同的应用程序,它们可以同时访问 CoreLocation,而且我们没有看到出现消耗。然而,当我们有一个带有 CoreLocation 的应用程序和另一个带有 CoreLocation + CoreBluetooth 的应用程序时,我们确实看到了这个问题。可能很少有应用程序使用 CoreLocation + CoreBluetooth 组合,因此可能这就是更多开发人员没有遇到此问题的原因。尽管我们无法解释 CoreLocation 和 CoreBluetooth 如何交互导致这种消耗以及第二个具有 CoreLocation 的应用程序如何进入等式。由于排水是间歇性的,因此问题可能只是在我们使用 CoreLocation + CoreBluetooth 进行测试时才发生。
在只安装了这两个应用程序 CTM1 和 FMC 的已擦除 5.0.1 iPhone 4S 上,我们能够间歇性地进入排水状态。有趣的是,与我们的普通设备相比,擦除设备上的排水问题似乎要少得多。不幸的是,我们只看到了几次流失状态,并且无法可靠地重现流失,我们没有良好的控制状态可以工作。
我们已向 Apple 提交了错误报告并公开了技术支持事件,但也许 Stackover 社区也可以提供一些见解。我们在 5.0.1 和 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 和重要位置监控,是否有理由致电 stopMonitoringSignificantLocationChanges?查看他们在进入前台时调用 stopMonitoringSignificantLocationChanges 和 startLocationUpdate 并在进入后台时调用 stopLocationUpdate 和 startMonitoringSignificantLocationChanges 的区域示例代码,但我想知道这是否必要/推荐/必需?
更新:
我们已与 Apple 开发者技术支持确认,对于同时使用 GPS 和重要位置监控的应用程序,我们在启用 GPS 更新之前关闭重要位置监控的顺序是正确的。
我们还确认,在 GM 5.1 和针对 5.1 框架重新编译的 Find My Car Smarter 应用程序中仍然可以看到排水问题。
更新:
当我们的应用从后台启动以响应重要的位置监控事件时,似乎触发了该问题。我们实际上并没有在示例代码中正确处理这种情况,但我们在实际的应用程序中这样做了。
在示例代码中,在后台重新启动时,我们将打开位置更新,由于没有 applicationDidEnterBackground 调用,GPS 将保持打开状态。
在我们的应用程序中,我们通过查找 UIApplicationLaunchOptionsLocationKey 标志来检查我们是否从后台启动,如果是,我们启动重要位置监控,否则我们在前台启动并开始更新位置。
Apple 回复我们并表示使用重要位置监控不需要在 Info.plist 的 UIBackgroundModes 数组中设置位置。我们删除了此条目,看来电池耗尽状态不再受到影响。我们在 UIBackgroundModes 列表中仍然有 bluetooth-central。目前我们还不清楚为什么这会有所帮助。我们将进行更多实验,以帮助我们更好地理解这一点。如果有人有任何建议,请告诉我们。
【问题讨论】:
-
Instruments 中有一个合适的电池消耗分析器。
-
“然后我们使用重要位置监控来自动重新启动我们的应用程序,以防系统终止我们的应用程序。”你能解释一下你的意思吗?我正在尝试找到一种解决方案来确保 BTLE 在后台持续存在。截至目前,在后台运行 5 分钟后,我的 iOS 应用程序失去了 BTLE 接收功能。
-
@user2057736 免责声明:我不知道我在说什么。但是OP甚至自己也说过这一点。在
UIBackgroundModes中设置蓝牙,让您的蓝牙保持活跃。
标签: ios core-location cllocationmanager power-management core-bluetooth