osx - "暂停"的最佳途径是什么?在Swift发布期间的第三方macOS应用程序?

时间:2017-05-14 21:37:50

标签: macos

我在Swift 3中一直在玩NSRunningApplication,我提出了几个问题。

  1. "暂停"最好的方法是什么?一个应用程序启动时。不要退出它,但也不要让它完全启动。只需保持图标在停靠栏中弹跳(即"冻结"启动)一段任意时间。在那段时间之后,如果我决定退出应用程序,我可以NSRunningApplication(withBundleIdentifier: "xyz").terminate() or .forceTerminate(),我可以通过.isTerminated()确认。否则,我可以解开"解冻"应用程序,让它完成启动。
  2. 什么是最不耗电的方式来检查应用程序的启动?我可以安排一个Timer来检查每半秒左右,但我相信它会占用相当多的内存。我可以设置监听器或通知以检查第三方应用程序启动吗? (即每次Notes应用程序更改为“终止状态”时运行一个函数)。
  3. 谢谢!

1 个答案:

答案 0 :(得分:1)

你无法可靠地定位另一个进程并从Swift(或任何其他用户模式程序)控制它,因为你真的需要在内核中使用内核扩展(Kext)来实现它。

Apple的官方框架是Kernel Authorization框架(KAuth)。使用File Operation Scope(在文档中描述),将向内核扩展通知各种操作,包括程序的执行,并允许或拒绝其访问。

可以在Google Santa的开源代码中看到其使用的工作示例,他们用它来管理自己的员工'电脑。正如其文件所述:

  

它包含一个监视执行的内核扩展,一个根据SQLite数据库的内容做出执行决策的userland守护进程,一个在块决策时通知用户的GUI代理和一个命令行实用程序。管理系统并使数据库与服务器同步。