我正在编写一个使用Apple的kiosk模式的应用程序。我想禁用屏幕保护程序,但“ScreenSaverDefaults”类报告自己只是32位。我可以将构建更改为仅32位,但我也希望能够支持64位架构。
我是否应该使用其他任何框架来禁用屏幕保护程序?
答案 0 :(得分:3)
首先,您需要保存当前设置,以便在关闭之前将其恢复原状:
NSTask *readTask = [[NSTask alloc] init];
[readTask setLaunchPath:@"/usr/bin/defaults"];
NSArray *arguments = [NSArray arrayWithObjects:@"-currentHost", @"read", @"com.apple.screensaver", @"idleTime", nil];
[readTask setArguments:arguments];
NSPipe *pipe = [NSPipe pipe];
[readTask setStandardOutput:pipe];
NSFileHandle *file = [pipe fileHandleForReading];
[readTask launch];
[readTask release];
NSData *data = [file readDataToEndOfFile];
NSString *originalValue = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
所以现在你有了屏幕保护程序的idleTime的原始值。大!不要失去那个。现在,您必须设置新值:
NSTask *writeTask = [[NSTask alloc] init];
[writeTask setLaunchPath:@"/usr/bin/defaults"];
NSArray *arguments = [NSArray arrayWithObjects:@"-currentHost", @"write", @"com.apple.screensaver", @"idleTime", @"0", nil];
[writeTask setArguments:arguments];
[writeTask launch];
[writeTask release];
中提琴!你刚刚禁用了屏幕保护程序。要重新启用它,只需再次使用第二个代码块,但将originalValue作为最后一个数组对象而不是@"0"
传递,如下所示:
NSArray *arguments = [NSArray arrayWithObjects:@"-currentHost", @"write", @"com.apple.screensaver", @"idleTime", originalValue, nil]
享受!
比利
P.S。:最后一件事,您可能想要保存NSTask对象以重复使用它们,但事实并非如此。它们只能运行一次,因此每次要执行此操作时都必须创建新的。
答案 1 :(得分:3)
对于任何搜索如何执行此操作的人(就像我一直在做的那样)并且不想乱编编辑首选项文件,Apple有一种正确的方法可以在应用程序运行时阻止屏幕保护程序启动
Technical Q&A QA1160: Preventing sleep
希望这有帮助。
答案 2 :(得分:1)
我最终做的是直接阅读com.apple.screensaver
首选项文件并修改idleTime
和askForPassword
值,使其为零。一个简单的CFPreferencesSynchronize
,一切都很好!