在 Mac OS X 上以编程方式获取睡眠时间(和其他节能设置)
Posted
技术标签:
【中文标题】在 Mac OS X 上以编程方式获取睡眠时间(和其他节能设置)【英文标题】:Programmatically get time until sleep (and other Energy Saver settings) on Mac OS X 【发布时间】:2012-04-01 19:48:25 【问题描述】:我想以编程方式获取 Mac OS X 上系统偏好设置中的节能设置,特别是我正在编写的小应用程序的“显示睡眠”或“计算机睡眠”设置。
我知道您可以检索睡眠设置,例如,使用来自this SO answer 的命令行
pmset -g | grep "^[ ]*sleep" | awk ' print $2 '
打印60
(我的正确睡眠时间),但如果可能的话,我更愿意使用本机 API 来获取这些设置。不幸的是,到目前为止,我的谷歌搜索还没有发现任何有用的东西。 NSUserDefaults
是我得到的最接近的,但我看不出如何使用它来获得我想要的设置。
有人可以帮忙吗?
【问题讨论】:
感谢您的链接。在我的研究过程中,我也发现了其中一些结果。有一些接近了,比如 IOPMLib 的东西,但似乎没有一个能满足我的要求。我本以为这样的事情会被很好地使用并记录在案——要么我遗漏了一些明显的东西,要么我错了! 【参考方案1】:是的,这个问题被问到已经超过 4 年了……目前还不清楚代码是用什么语言编写的。使用 Objective-C。
节电偏好设置位于:
/Library/Preferences/SystemConfiguration/com.apple.PowerManagement.plist
在 Mac 应用程序中,我们现在可以使用:
NSString *powerMgt = @"/Library/Preferences/SystemConfiguration/com.apple.PowerManagement.plist";
NSDictionary *power = [NSDictionary dictionaryWithContentsOfFile:powerMgt];
// for example the sleep time on AC power
NSNumber *sleepyTime = [[[power objectForKey:@"Custom Profile"] objectForKey:@"AC Power"] objectForKey:@"System Sleep Timer"];
字典看起来像:
ActivePowerProfiles =
"AC Power" = "-1";
"Battery Power" = "-1";
;
"Custom Profile" =
"AC Power" =
"Disk Sleep Timer" = 10;
"Display Sleep Timer" = 10;
"Display Sleep Uses Dim" = 1;
GPUSwitch = 2;
"Hibernate File" = "/var/vm/sleepimage";
"Hibernate Mode" = 3;
"Mobile Motion Module" = 1;
PrioritizeNetworkReachabilityOverSleep = 0;
"Standby Delay" = 4200;
"Standby Enabled" = 0;
"System Sleep Timer" = 0;
TTYSPreventSleep = 1;
"Wake On AC Change" = 0;
"Wake On Clamshell Open" = 1;
"Wake On LAN" = 1;
;
"Battery Power" =
"Disk Sleep Timer" = 10;
"Display Sleep Timer" = 10;
"Display Sleep Uses Dim" = 1;
GPUSwitch = 2;
"Hibernate File" = "/var/vm/sleepimage";
"Hibernate Mode" = 3;
"Mobile Motion Module" = 1;
ReduceBrightness = 1;
"Standby Delay" = 4200;
"Standby Enabled" = 0;
"System Sleep Timer" = 15;
TTYSPreventSleep = 1;
"Wake On AC Change" = 0;
"Wake On Clamshell Open" = 1;
;
;
【讨论】:
【参考方案2】:查看pmset的来源后,这是我想出的:
#include <SystemConfiguration/SystemConfiguration.h>
#include <CoreFoundation/CoreFoundation.h>
#define kIOPMDynamicStoreSettingsKey "State:/IOKit/PowerManagement/CurrentSettings"
#define kIOPMSystemSleepKey "System Sleep Timer"
SCDynamicStoreRef dynamicStore = SCDynamicStoreCreate(NULL, CFSTR("get-sleep-time"), NULL, NULL);
CFDictionaryRef dictionaryRef = SCDynamicStoreCopyValue(dynamicStore, CFSTR(kIOPMDynamicStoreSettingsKey));
CFTypeRef typeRef = CFDictionaryGetValue(dictionaryRef, CFSTR(kIOPMSystemSleepKey));
int minutes;
CFNumberGetValue(typeRef, kCFNumberIntType, (void *)&minutes);
CFRelease(dynamicStore);
CFRelease(dictionaryRef);
CFRelease(typeRef);
minutes
将包含以分钟为单位的计算机睡眠值。
【讨论】:
以上是关于在 Mac OS X 上以编程方式获取睡眠时间(和其他节能设置)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Android 上以编程方式从 Mac 地址获取 IP 地址?