วิธีทำให้ 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
มันบอกฉันว่า System Events ไม่ทำงาน - person ; 03.02.2020
comment
คุณได้ตรวจสอบการตั้งค่าระบบของคุณ > ความปลอดภัยและความเป็นส่วนตัว > แท็บความเป็นส่วนตัว > ระบบอัตโนมัติ > แอพของคุณ > กล่องกาเครื่องหมายกิจกรรมของระบบหรือไม่ เมื่อคุณเรียกใช้แอปของคุณเป็นครั้งแรก ควรแจ้งให้คุณอนุญาตหาก App Sandbox ของคุณถูกปิดใช้งานและหาก NSAppleEventsUsageDescription อยู่ในรายการข้อมูลของคุณ - person Leo Dabus; 03.02.2020
comment
คุณอาจต้องอนุญาตให้ระบบของคุณเรียกใช้แอพได้จากทุกที่ ไปที่แอปพลิเคชันของคุณ > ยูทิลิตี้ > Terminal และเรียกใช้ 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 หลังจากคลิกตกลง ก็ควรจะเข้าสู่โหมดสลีป ฉันเพิ่งทดสอบในเครื่องอื่นที่ใช้ Mojave เพียงแค่ต้องลดเป้าหมายระบบปฏิบัติการลง - person Leo Dabus; 03.02.2020