我当前的项目是一个恒定状态的应用程序(例如Tinder或Foursquare),电池消耗是通过屋顶来实现的。我们认为主要的功耗来自GPS和WiFi天线。我们希望能够在几种不同的配置下测量应用程序的能源使用情况。
但是该怎么做呢?我们想要一个过程,该过程:
我知道很多。
这些是要求,以下是我知道的选项:
1.在iOS设备上打开不受限制的能源诊断程序,并导出到Instruments
这是显而易见的答案,但是它有一个巨大的缺陷。
优点:
缺点:
2.通过乐器监视插入的电话
优点:
缺点:
3.使用公共(public) cocoa API记录应用程序中的能源使用– [UIDevice.currentDevice batteryLevel]
这是关于SO的最常见答案。我看过Estimated battery time on iOS,iphone: Calculating battery life和其他十几个。
优点:
缺点:
4.使用私有(private) cocoa API记录能源使用情况
由于我们只会在开发期间进行此操作,因此Apple是否会拒绝使用私有(private)API的应用程序无关紧要。大概有一些专用API可以使用,因为Apple可以在Untethered Energy Diagnostics开启的情况下记录数据。
优点:
缺点:
5.组合方法
我们可以使用不受限制的诊断方法来量化每个操作的边际能源成本。 “好吧,旋转GPS天线需要150mW•H。计算位置需要50mW•H。发送Mixpanel事件需要25mW•H,除非我们在前30秒内进行了另一个网络调用,在这种情况下需要15mW•H。” (所有的数字都是当场发明的。)然后,我们可以使用系留监控器来记录这些 Action 中的每一个何时发生,插入一个线性方程式,并估算应该采取的能量。
优点:
缺点:
不管怎样,我已经足够虚张声势了。有人做过吗?如何?
最佳答案
不知道这是否适用于这个确切的用例,但是我已经开发了一个名为UIDeviceListener
的库,该库使您可以轻松地(基本上使用一行代码)从操作系统中检索有关功耗和许多其他电池/的数据。收费相关数据点:https://github.com/eldoogy/PowerData
这是一个示例字典,可让您大致了解可以获取的信息种类。我将把您的注意力转移到InstantAmperage键上。这显示了整个设备(拔出设备时)的实时功耗(毫安)。这可能有助于完成您在此处查找的内容。
{
AdapterDetails = {
Amperage = 1000;
Description = "usb host";
FamilyCode = "-536854528";
PMUConfiguration = 1000;
Watts = 5;
};
AdapterInfo = 16384;
Amperage = 1000;
AppleRawCurrentCapacity = 1279;
AppleRawMaxCapacity = 1275;
AtCriticalLevel = 0;
AtWarnLevel = 0;
BatteryData = {
BatterySerialNumber = REDACTED;
ChemID = 355;
CycleCount = 524;
DesignCapacity = 1420;
Flags = 640;
FullAvailableCapacity = 1325;
ManufactureDate = REDACTED;
MaxCapacity = 1273;
MfgData = REDACTED;
QmaxCell0 = 1350;
StateOfCharge = 100;
Voltage = 4194;
};
BatteryInstalled = 1;
BatteryKey = "0003-default";
BootBBCapacity = 52;
BootCapacityEstimate = 2;
BootVoltage = 3518;
CFBundleIdentifier = "com.apple.driver.AppleD1815PMU";
ChargerConfiguration = 990;
CurrentCapacity = 1275;
CycleCount = 524;
DesignCapacity = 1420;
ExternalChargeCapable = 1;
ExternalConnected = 1;
FullyCharged = 1;
IOClass = AppleD1815PMUPowerSource;
IOFunctionParent64000000 = <>;
IOGeneralInterest = "IOCommand is not serializable";
IOInterruptControllers = (
IOInterruptController34000000,
IOInterruptController34000000,
IOInterruptController34000000,
IOInterruptController34000000
);
IOInterruptSpecifiers = (
<03000000>,
<26000000>,
<04000000>,
<24000000>
);
IOMatchCategory = AppleD1815PMUPowerSource;
IOPowerManagement = {
CurrentPowerState = 2;
DevicePowerState = 2;
MaxPowerState = 2;
};
IOProbeScore = 0;
IOProviderClass = AppleD1815PMU;
InstantAmperage = 0;
IsCharging = 0;
Location = 0;
Manufacturer = A;
MaxCapacity = 1275;
Model = "0003-A";
Serial = REDACTED;
Temperature = 2590;
TimeRemaining = 0;
UpdateTime = 1461830702;
Voltage = 4182;
"battery-data" = {
"0003-default" = <...>;
"0004-default" = <...>;
"0005-default" = <...};
"built-in" = 1;
}
UIDeviceListener
支持常规的,不越狱的iOS设备,并且不调用任何私有(private)API。
关于ios - 详细的电池使用情况-iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24831813/