如何以编程方式防止 Mac 进入睡眠状态? [英] How to programmatically prevent a Mac from going to sleep?

查看:23
本文介绍了如何以编程方式防止 Mac 进入睡眠状态?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有办法防止 Mac 使用 Objective-C 以编程方式进入睡眠状态?Apple 开发站点上的 I/O 套件基础部分告诉我,驱动程序收到空闲/系统睡眠通知,但我找不到阻止系统睡眠的方法.甚至有可能吗?

Is there way to prevent a Mac from going to sleep programmatically using Objective-C? The I/O kit fundamentals section on Apple's dev site tells me that a driver gets notified of an idle / system sleep, but I can't find a way of preventing the system from sleeping. Is it even possible?

我遇到过其他一些使用 Caffeine、jiggler、sleepless 甚至 AppleScript 的解决方案,但我想在 Objective-C 中做到这一点.谢谢.

I've come across some other solutions using Caffeine, jiggler, sleepless and even AppleScript, but I want to do this in Objective-C. Thanks.

推荐答案

以下是 Apple 官方文档(包括代码片段):
技术问答 QA1340 - 如何防止睡眠?

Here is the official Apple documentation (including code snippet):
Technical Q&A QA1340 - How to I prevent sleep?

引用:在 Mac OS X 10.6 Snow Leopard 中使用 I/O Kit 防止睡眠:

Quote: Preventing sleep using I/O Kit in Mac OS X 10.6 Snow Leopard:

#import <IOKit/pwr_mgt/IOPMLib.h>

// kIOPMAssertionTypeNoDisplaySleep prevents display sleep,
// kIOPMAssertionTypeNoIdleSleep prevents idle sleep

// reasonForActivity is a descriptive string used by the system whenever it needs 
// to tell the user why the system is not sleeping. For example, 
// "Mail Compacting Mailboxes" would be a useful string.

// NOTE: IOPMAssertionCreateWithName limits the string to 128 characters. 
CFStringRef* reasonForActivity= CFSTR("Describe Activity Type");

IOPMAssertionID assertionID;
IOReturn success = IOPMAssertionCreateWithName(kIOPMAssertionTypeNoDisplaySleep, 
                                    kIOPMAssertionLevelOn, reasonForActivity, &assertionID); 
if (success == kIOReturnSuccess)
{
    //  Add the work you need to do without 
    //  the system sleeping here.

    success = IOPMAssertionRelease(assertionID);
    //  The system will be able to sleep again. 
}

对于较旧的 OSX 版本,请检查以下内容:
技术问答 QA1160 - 如何在我的应用程序运行时防止系统休眠运行?

For older OSX version, check the following:
Technical Q&A QA1160 - How can I prevent system sleep while my application is running?

引用: UpdateSystemActivity 的示例用法(<10.6 的规范方式)

Quote: Example usage of UpdateSystemActivity (the canonical way for < 10.6)

#include <CoreServices/CoreServices.h>

void
MyTimerCallback(CFRunLoopTimerRef timer, void *info)
{
    UpdateSystemActivity(OverallAct);
}


int
main (int argc, const char * argv[])
{
    CFRunLoopTimerRef timer;
    CFRunLoopTimerContext context = { 0, NULL, NULL, NULL, NULL };

    timer = CFRunLoopTimerCreate(NULL, CFAbsoluteTimeGetCurrent(), 30, 0, 0, MyTimerCallback, &context);
    if (timer != NULL) {
        CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopCommonModes);
    }

    /* Start the run loop to receive timer callbacks. You don't need to
    call this if you already have a Carbon or Cocoa EventLoop running. */
    CFRunLoopRun();

    CFRunLoopTimerInvalidate(timer);
    CFRelease(timer);

    return (0);
}

这篇关于如何以编程方式防止 Mac 进入睡眠状态?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆