在应用程序运行时阻止 Mac 进入睡眠状态

Nev*_*ani -1 macos swift

我想阻止用户的 Macbook 在应用程序运行时自动休眠。我该怎么做?我见过这个

https://developer.apple.com/library/content/qa/qa1340/_index.html

和这个:

快速禁用 OS X 中的睡眠模式

和这个:

使用 Swift 禁用 OSX 的睡眠/屏幕保护程序

但是没有我可以放置的简单代码行或委托方法使这像在 iOS 中一样简单?我只想让整个应用程序正常工作并阻止计算机自动进入睡眠状态。如果有人手动将其放入睡眠状态,那么显然没问题。我不想阻止用户让计算机进入睡眠状态。但是只要我的应用程序正在运行,我就不希望计算机进入睡眠状态。就像您在看电影时一样,该应用程序不会进入睡眠状态。我怎么做?

我觉得这是我需要的代码,但是我是否只需在 viewdidload 中运行此函数就可以了?有那么简单吗?

var assertionID: IOPMAssertionID = 0
var success: IOReturn?

func disableScreenSleep(reason: String = "Unknown reason") -> Bool? {
    guard success != nil else { return nil }
    success = IOPMAssertionCreateWithName( kIOPMAssertionTypeNoDisplaySleep as CFString,
                                       IOPMAssertionLevel(kIOPMAssertionLevelOn),
                                       reason as CFString,
                                       &assertionID )
    return success == kIOReturnSuccess
}
Run Code Online (Sandbox Code Playgroud)

Leo*_*bus 5

正如我在评论中已经提到的,你需要移除守卫,否则它只会返回 nil 并且永远不会禁用屏幕睡眠。您还可以简化您的方法,返回 void 并将您的 success 属性更改为 Bool 属性,例如 disabled 以监视屏幕睡眠状态:

var assertionID: IOPMAssertionID = 0
var sleepDisabled = false
func disableScreenSleep(reason: String = "Disabling Screen Sleep") {
    if !sleepDisabled {
        sleepDisabled = IOPMAssertionCreateWithName(kIOPMAssertionTypeNoDisplaySleep as CFString, IOPMAssertionLevel(kIOPMAssertionLevelOn), reason as CFString, &assertionID) == kIOReturnSuccess
    }

}
func enableScreenSleep() {
    if sleepDisabled {
        IOPMAssertionRelease(assertionID)
        sleepDisabled = false
    }

}
Run Code Online (Sandbox Code Playgroud)

要禁用屏幕,只需调用第一个视图控制器的 viewDidLoad 中的方法:

override func viewDidLoad() {
    super.viewDidLoad()
    disableScreenSleep()
    print("sleep Disabled:", sleepDisabled)
}
Run Code Online (Sandbox Code Playgroud)