2011-04-22 149 views
9

我正在構建一個需要每分鐘輪詢一次服務器的Mac OSX應用程序,或者如果用戶希望的話更少。不幸的是,服務不支持推送......Mac - 獲取電池/充電狀態(插入或不插入)

不管怎麼說,我想提供兩個選項給用戶:

  1. 輪詢間隔上電池巡檢
  2. 間隔而充電

如何獲得目標C中充電器的狀態?只有在筆記本電腦插入或沒有插入時,我纔會真正關心實際的百分比。顯然,這對臺式機來說並不重要,所以希望有一種適用於筆記本電腦和臺式機的解決方案。

回答

14

查看IOPowerSources API。

首先撥打IOPSCopyPowerSourcesInfo(),然後IOPSCopyPowerSourcesList()獲取所有可用電源的列表。 IOPSGetPowerSourceDescription()將返回包含關於特定電源信息的字典。根據文件,鑰匙kIOPSPowerSourceStateKey描述「當前電源,kIOPSBatteryPowerValue表示電源正在吸取內部電源; kIOPSACPowerValue表示電源連接到外部電源。」

您還可以在電源變化時設置通知IOPSNotificationCreateRunLoopSource()

(注:我沒有測試過任何這,只是看着文檔)

+4

'IOPSCopyExternalPowerAdapterDetails()'似乎是一個更好的比賽:「如果沒有(交流/外接電源)適配器連接,或者如果有錯誤,返回'NULL'' – 2011-04-22 00:57:02

+0

非常感謝! – 2011-04-24 00:34:43

6

雖然這個問題並已經有一個公認的答案,害得我到我的解決方案,這是痛苦通過大量的點擊和很多斷開的鏈接。

這裏是我的解決方案:

  1. 添加IOKit.framework
  2. 進口#import <IOKit/ps/IOPowerSources.h>
  3. 代碼:

    CFTimeInterval timeRemaining = IOPSGetTimeRemainingEstimate(); 
    
    if (timeRemaining == kIOPSTimeRemainingUnlimited) { 
         // connected to outlet 
    } else if (timeRemaining == kIOPSTimeRemainingUnknown){ 
         // time remaining unknown (recently unplugged) 
    } else if ((timeRemaining/60) < 30){ 
         // less than 30 minutes remaining 
    } 
    
+0

-2(充電器插頭)和-1充電器拔掉或它會給電池壽命的幾秒鐘 – 2015-08-04 09:44:39

+1

這對我來說非常合適,而且更清晰。 – Volomike 2016-03-25 20:30:20