在 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 上以编程方式获取睡眠时间(和其他节能设置)的主要内容,如果未能解决你的问题,请参考以下文章

在 OS X 上以编程方式启用“全键盘访问”

在 OS X 上以编程方式打开通知中心

如何在 Android 上以编程方式从 Mac 地址获取 IP 地址?

Mac os x以编程方式获取域名

转OS X Mavericks: 防止 Mac 进入睡眠 -- 不错

Mac OS X Safari 6 默认搜索引擎在可能值之间发生变化