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?
I've come across some other solutions using Caffeine, jiggler, sleepless and even AppleScript, but I want to do this in Objective-C. Thanks.
Here is the official Apple documentation (including code snippet):
Technical Q&A QA1340 - How to I prevent sleep?
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. }
For older OSX version, check the following:
Technical Q&A QA1160 - How can I prevent system sleep while my application is running?
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); }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With