如何使用Swift以编程方式将Mac置于睡眠状态

kh212irz  于 2023-09-30  发布在  Swift
关注(0)|答案(2)|浏览(107)

我正在写一个程序,让我的MacBook Pro在应用程序打开时进入睡眠状态,但我似乎无法弄清楚。我不知道这是否与电源管理或其他有关,但从我发现的情况来看,它与IOKit.pwr_mgt有关。您的帮助将不胜感激!下面的代码只是如何启用睡眠模式,但不把电脑进入睡眠模式.我还找到了applicationDidFinishLaunching函数,因此代码在该函数中。

var assertionID: IOPMAssertionID = 0
var success = IOPMAssertionRelease(assertionID)
wkyowqbh

wkyowqbh1#

它与电源管理无关。实际上,您需要在应用程序中运行脚本。
要做到这一点,最简单的方法是首先禁用应用程序沙箱功能。
接下来转到您的应用程序info.plist并添加NSAppleEventsUsageDescription密钥和描述,类似于"This app needs your permission to put the display to sleep."
现在,您只需要执行一个Apple脚本,告诉应用程序系统事件休眠。"tell application \"System Events\" to sleep"
创建一个方法来执行该脚本:

func startScreenSleep() {
    let script = "tell application \"System Events\" to sleep"
    guard let appleScript = NSAppleScript(source: script) else { return }
    var error: NSDictionary?
    appleScript.executeAndReturnError(&error)
    if let error = error {
        print(error[NSAppleScript.errorAppName] as! String)
        print(error[NSAppleScript.errorBriefMessage] as! String)
        print(error[NSAppleScript.errorMessage] as! String)
        print(error[NSAppleScript.errorNumber] as! NSNumber)
        print(error[NSAppleScript.errorRange] as! NSRange)
    }
}

然后从ViewController的viewDidLoad方法调用它:

override func viewDidLoad() {
    super.viewDidLoad()
    startScreenSleep()
}
mf98qq94

mf98qq942#

只需运行bash脚本“pmset sleepnow”

@IBAction func sleepAction(_ sender: Any) {
        do {
            try safeShell("pmset sleepnow")
        } catch {
            print("\(error)")
        }
    }
    
    @discardableResult 
    func safeShell(_ command: String) throws -> String {
        let task = Process()
        let pipe = Pipe()
        
        task.standardOutput = pipe
        task.standardError = pipe
        task.arguments = ["-c", command]
        task.executableURL = URL(fileURLWithPath: "/bin/bash")
        task.standardInput = nil

        try task.run()
        
        let data = pipe.fileHandleForReading.readDataToEndOfFile()
        let output = String(data: data, encoding: .utf8)!
        
        return output
    }

相关问题