如何使用 Swift 以编程方式让 Mac 进入睡眠状态

Posted

技术标签:

【中文标题】如何使用 Swift 以编程方式让 Mac 进入睡眠状态【英文标题】:How to put Mac to sleep programmatically with Swift 【发布时间】:2020-05-18 16:21:32 【问题描述】:

我正在编写一个程序,让我的 MacBook Pro 在应用程序打开时进入睡眠状态,但我似乎无法弄清楚。我不知道这是否与电源管理有关,但据我发现,它与 IOKit.pwr_mgt 有关。您的帮助将不胜感激!下面的代码只是如何启用睡眠模式而不是让计算机进入睡眠模式。我还找到了 applicationDidFinishLaunching 函数,所以代码在那个函数中。

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

【问题讨论】:

【参考方案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)
    


并从您的 ViewController 的 viewDidLoad 方法中调用它:

override func viewDidLoad() 
    super.viewDidLoad()
    startScreenSleep()

【讨论】:

它告诉我系统事件没有运行 您是否检查了您的系统首选项 > 安全和隐私 > 隐私选项卡 > 自动化 > 您的应用程序 > 系统事件复选框?当您第一次运行您的应用程序时,如果您的应用程序沙箱被禁用并且 NSAppleEventsUsageDescription 在您的信息列表中,它应该提示您允许它 您可能需要允许您的系统从任何地方运行应用程序。转到您的应用程序 > 实用程序 > 终端并运行 sudo spctl --master-disable @TheCodeGuy dropbox.com/s/u3n4by04ub0kvol/… 如果应用沙箱被禁用,它并没有真正提示我允许

以上是关于如何使用 Swift 以编程方式让 Mac 进入睡眠状态的主要内容,如果未能解决你的问题,请参考以下文章

Cocoa Xcode:使用 Swift 4 for Mac 以编程方式从 AppDelegate 打开窗口控制器?

Swift:如何以编程方式设置 iphone 音量 [重复]

如何在不使用 UINavigationController 的情况下以编程方式进入 rootViewController

在 Swift 中以编程方式创建 NSTextField

在 Swift 中以编程方式切换视图

使用 Swift 以编程方式插入按钮并加载第二个视图