Как программно перевести Mac в спящий режим с помощью Swift

Я пишу программу, чтобы мой MacBook Pro переходил в спящий режим при открытии приложения, но я не могу понять это. Я не знаю, связано ли это с управлением питанием или с чем-то еще, но из того, что я обнаружил, это как-то связано с IOKit.pwr_mgt. Ваша помощь будет оценена по достоинству! В приведенном ниже коде показано, как включить спящий режим, но не переводить компьютер в спящий режим. Я также нашел функцию applicationDidFinishLaunching, поэтому код находится в этой функции.

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

person Community    schedule 02.02.2020    source источник


Ответы (1)


Это не связано с управлением питанием. На самом деле вам нужно будет запустить скрипт с вашим приложением.

Самый простой способ добиться этого — сначала отключить возможность песочницы вашего приложения.

Затем перейдите в свое приложение 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)
    }
}

И вызовите его из метода viewDidLoad вашего ViewController:

override func viewDidLoad() {
    super.viewDidLoad()
    startScreenSleep()
}
person Leo Dabus    schedule 03.02.2020
comment
У меня пишет, что системные события не запущены - person ; 03.02.2020
comment
Проверяли ли вы системные настройки > безопасность и конфиденциальность > вкладка конфиденциальность > Автоматизация > Ваше приложение > Флажок «Системные события»? Когда вы запускаете свое приложение в первый раз, оно должно предложить вам разрешить его, если ваша песочница приложения отключена и если NSAppleEventsUsageDescription находится в вашем информационном списке. - person Leo Dabus; 03.02.2020
comment
Возможно, вам потребуется разрешить вашей системе запускать приложения из любого места. Перейдите в Приложения › Утилиты › Терминал и запустите sudo spctl --master-disable - person Leo Dabus; 03.02.2020
comment
@TheCodeGuy dropbox.com/s/u3n4by04ub0kvol/ - person Leo Dabus; 03.02.2020
comment
На самом деле это не предлагает мне разрешить, если песочница приложения отключена. - person ; 03.02.2020
comment
Вы должны увидеть это диалоговое окно при запуске приложения, указанного выше dropbox.com /s/2cs2u8wnf4s4sqv/dialog%20box.png?dl=1 После нажатия кнопки «ОК» он должен заснуть. Я только что протестировал его на другой машине с Мохаве. Просто нужно понизить цель ОС - person Leo Dabus; 03.02.2020