如何从连接的 iOS 设备获取电池充电周期?

Posted

技术标签:

【中文标题】如何从连接的 iOS 设备获取电池充电周期?【英文标题】:How Do I get Battery Charge Cycles from a connected iOS device? 【发布时间】:2013-12-14 16:46:06 【问题描述】:

我在OS X 应用程序中使用MobileDevice.framework,并且我已经能够了解通过USB 连接的ios 设备的电池如何充电使用带有参数@ 的AMDeviceCopyValue(device, domain, key) 函数987654327@ 用于domain"BatteryCurrentCapacity" 用于key

我还想获取电池的充电周期数。我相信这是可能的,因为iBackupBot 能够获取该数据。有谁知道它是怎么做到的?我下载了该程序的免费副本并在iPhone 3GSiPhone 4SiPhone 5 上对其进行了测试。它能够抓取所有三个设备的数据。

我已经通过 LLDB 运行 iBackupBot 并记录了它对 AMDeviceCopyValue() 的每次使用。在这样做时,我确定它没有从中获取充电周期数。

【问题讨论】:

我授予赏金是因为我不想看到它被浪费(当然他为我提供了很多我不知道的相关信息)但它并没有真正回答这个问题,所以我没有接受这个答案,直到有人给出答案。我计划稍后在我有更多时间时使用 Hopper Decompiler 攻击 iBackupBot(已经执行此操作的应用程序).​​..如果有人在我之前没有提出解决方案,我会在找到它时在这里发布解决方案. 您好,我想在 iPhone 上安装这个,有什么更新吗?谢谢。 @flypig - 如果您可以使用私有框架,请查看我授予赏金的答案。如果没有,我怀疑你可以在 iOS 上做到这一点。 【参考方案1】:

您可以使用设备的ioreg (IORegistry) 转储获取CycleCount 和一堆其他信息。例如,请参阅here 获取 iPhone 5S 的 IORegistry 转储。请注意此部分:

 +-o AppleD2045PMUPowerSource  <class AppleD2045PMUPowerSource, busy 0, retain count 10>
    | |   |   |   |   
    | |   |   |   |     "battery-data" = 
                            .....
                            "CycleCount" = 1
        | |   |   |   |     "ChargerConfiguration" = 960
        | |   |   |   |     "DesignCapacity" = 1550
        | |   |   |   |     "BatteryData" = "BatterySerialNumber"="C0133237ALXFHCWBP","ChemID"=4484,"Flags"=256,"QmaxCell0"=1619,"Voltage"=4051,"CycleCount"=1,"StateOfCharge"=72,"DesignCapacity"=1550,"FullAvailableCapacity"=1573,"MaxCapacity"=1517,"MfgData"=<4330313333323337414c58464843574250000000000000010000010000000100>,"ManufactureDate"="1332"
        | |   |   |   |     "AtCriticalLevel" = No

iOS 上的私有 IOKit.framework 有一个用于访问所有这些信息的 API(您可以查看转储以找出属性名称等,以便能够以编程方式访问它)。 Erica Sadun 有一些 open source code 使用私有 IOKit 函数来访问一些设备硬件信息(无需越狱,IIRC)所以也许这会有所帮助。

至于从 Mac 获取此信息,不知道。如果您有一个可以从 IORegistry 中提取信息并通过 USB 将其发送到 Mac 的设备上应用程序,则该应用程序可以正常工作。如果您想在设备上不安装任何其他软件的情况下执行此操作,则必须想办法远程获取ioreg 转储。

希望这能让你有所收获!

【讨论】:

此代码看起来与我看到的用于获取 MacBook 电池充电周期的代码基本相同。我现在会为此 +1,如果一周内没有更好的结果,我会给你赏金,但我更喜欢一些我可以在 Mac 上运行的代码来获取数据。例如,信息可能存储在我可以提取的 iOS 设备上的文件中?我想越狱社区的人一定知道iOS隐藏文件目录中的各种东西...... 来自 Apple 关于 OS X 版本 IOKit 的文档:“I/O Kit 的动态部分,注册表不存储在磁盘上或在引导之间存档。相反,它在每个系统中构建启动并驻留在内存中。” (来源:developer.apple.com/library/mac/documentation/DeviceDrivers/…) 是的,所以听起来像是在不安装其他软件的情况下从 Mac 获取它的一种方法是找到一种方法来远程调用设备上的 ioreg 以生成注册表转储。 SSH 是一种方式,但这需要越狱。 好的。现在我需要一个不涉及越狱的解决方案。 (我一直提到越狱的唯一原因是因为我希望对 Apple 隐藏的东西有深入了解的人会知道一个灰色区域,即使 Apple 没有公开记录越狱的方法。) 在更多以自制/越狱为中心的论坛上,您可能会比 SO 获得更多关于私有 API 的信息 :)【参考方案2】:

我猜你说的是获取设备的电池状态,启用 UIDevice 对象的batteryMonitoringEnabled 后,你可以获取电池的当前状态和电量,

喜欢,

UIDevice *device = [UIDevice currentDevice];
device.batteryMonitoringEnabled = YES;
NSLog(@"State: %i Charge: %f", device.batteryState, device.batteryLevel);

你可以得到不同的设备的 UIDeviceBatteryState

UIDeviceBatteryStateUnplugged, UIDeviceBatteryStateCharging, UIDeviceBatteryStateFull,

【讨论】:

1 - 我想要电池的充电周期数。也就是说,自从电池首次放入设备以来,电池从充满到耗尽再返回多少次。这是一个很好的指标,可以了解您的电池将永久耗尽还有多长时间。 2 - 我想在连接到 iOS 设备的计算机上运行的应用程序中访问此号码,而不是在 iOS 设备本身上运行的应用程序中。不过老实说,如果有人能告诉我如何使用设备上的应用程序获得充电周期,我可能会在本周末解决,即使它需要越狱。 @ArtOfWarfare,你现在找到解决方案了吗,我也想做同样的事情 @jimwan - 对不起,不。我在 2014 年初放弃了这个。

以上是关于如何从连接的 iOS 设备获取电池充电周期?的主要内容,如果未能解决你的问题,请参考以下文章

想知道你的洗地机锂电池保养得到位不到位吗,看这里!

如何在独立的智能手表应用程序或表盘中检查蓝牙连接手机的电池电量? [关闭]

蓝牙键盘怎么连接手机?

联想拯救者R720 电源怎么显示已连接未充电

iOS 14为AirPods引入“优化电池充电”功能

蓄电池充电蓄电池如何正确充电 蓄电池充电方法详解 - 转