在Swift中禁用应用程序休眠

10

如何在Swift中禁用应用程序nap?我是新手程序员,正在构建一个计时器(仅供练习),我担心应用程序nap会破坏我的计时器。


不确定什么是应用程序休眠,但您是否正在寻找idleTimerDisabled - Desdenova
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Vitor Loureiro
我的错,没有注意到OS X标签。 - Desdenova
4个回答

7
我发现这个解决方案也适用于Swift。
创建一个类或全局变量。
var activity: NSObjectProtocol?

然后分配它,之后App Nap将被禁用。

activity = NSProcessInfo().beginActivityWithOptions(NSActivityOptions.UserInitiated, reason: "Good Reason")

5

Swift 4.x / 5.3:

关于 ProcessInfo.ActivityOptions,苹果文档描述如下:

static var userInitiated

标记表示应用正在执行用户请求的操作。

static var userInitiatedAllowingIdleSystemSleep

标记表示应用正在执行用户请求的操作,但系统可以在空闲时休眠。

除非你的意图是防止系统休眠,否则应该使用 userInitiatedAllowingIdleSystemSleep

步骤

  1. Retain reference in a scope that will survive until any point you may want to revert the change (ie: within AppDelegate)

     var activity: NSObjectProtocol?
    
  2. Run this, possibly in AppDelegate applicationDidFinishLaunching:

     activity = ProcessInfo.processInfo.beginActivity(options: .userInitiatedAllowingIdleSystemSleep, reason: "Good Reason")
    

随时取消或重新启用App Nap的方法:

if let pinfo = activity {
    ProcessInfo.processInfo.endActivity(pinfo)
}

5

Swift 3:

var activity: NSObjectProtocol?

并且

activity = ProcessInfo().beginActivity(options: ProcessInfo.ActivityOptions.userInitiated, reason: "Good Reason")

0

之前的三个回答都没有正确使用 ProcessInfo 类。根据 ProcessInfo 文档

每个进程都有一个单一的、共享的 ProcessInfo 对象,称为进程信息代理。 processInfo 类型属性 [以前是类方法] 返回当前进程的共享代理。

processInfo 文档 进一步解释了它:

该对象在第一次调用此属性 [以前是方法] 时创建,并在每次后续调用时返回相同的对象。

否则,在开始和结束活动时引用不同的 ProcessInfo 对象实例(必须结束活动),这可能会导致不正确的行为。因此,在 Swift 5 中正确的代码是:

let activity = ProcessInfo.processInfo.beginActivity(options: .userInitiatedAllowingIdleSystemSleep, reason: "Timer")
// Perform some work
ProcessInfo.processInfo.endActivity(activity)

虽然应用程序和计时器实现的细节不明确,但很难说这种方法在您的情况下是否正确。请还要考虑以下注意事项:

如果您的活动在主线程上的事件回调中同步进行,则无需使用此API。

请注意,长时间未结束这些活动可能会对用户计算机的性能产生重大负面影响,因此请确保仅使用所需的最短时间。用户偏好可能会覆盖您的应用程序请求。

使用Timer对象(并尽可能引入一些容错性)可能是更正确的方法。系统(及其App Nap功能)应该考虑计时器。测试和活动监视器将为您提供信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接