jl3*_*303 5 macos cocoa swift swift4
我的应用程序是一个菜单应用程序,它位于后台运行的菜单附加功能中,我试图让它在登录时运行。使用 Swift 4 为 High Sierra 实现这一目标的最新推荐做法是什么?
根据设计守护进程和服务,MacOS 上有四种不同的后台进程。
因为我希望我的应用程序在用户登录时运行,我猜它要么是登录项,要么是启动代理。但是,对于登录项,似乎有两种方法可以实现使用服务管理框架或共享文件列表。
我首先尝试使用共享文件列表,基于github 的这个示例。但是,Xcode 会抛出一堆已弃用的警告和错误,表明它不再支持 Swift 4 和最新的 MacOS。
然后我使用本指南中的SMLoginItemSetEnabled 让它工作。但是,使用这种方法,我的应用程序不会在登录项下显示系统首选项。
Swift 4 和 High Sierra 完全无法选择共享文件列表方法吗?
发射代理呢?我找不到太多关于使用 Swift 将应用程序制作为启动代理的指南。如果有人可以分享一些代码,我将不胜感激。
谢谢!
我建议创建一个启动代理。登录项目太2010年了;)。
实际上没有用于创建启动代理(或其他launchd服务)的 API。步骤基本上是:
~/Library/LaunchAgents/com.your.agent.plist文件/bin/launchctl bootstrap gui/501 ~/Library/LaunchAgents/com.your.agent.plist(其中501和com.your.agent是用户的 UID 和您的 launchd 标识符)
第二步是可选的;系统将.plist在下次系统重新启动时看到您的文件并自动启动代理。因此,您可以通过第一次手动启动它来启动它。但是,如果您希望它立即注册launchd(例如,如果退出,它会自动重新启动),那么我知道除了运行launchctl一次来注册它之外没有其他方法。(同样,当需要卸载它时,您需要运行launchctl bootout ...将其关闭。[1])
该文件的详细信息.plist可以在 中找到man launchd.plist,但这里有一个LSUIElement名为“Menu”的应用程序的简单示例,每当用户登录到 GUI 会话时,该应用程序就会在后台运行:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>KeepAlive</key>
<dict>
<key>SuccessfulExit</key>
<false/>
</dict>
<key>Label</key>
<string>com.my.menu</string>
<key>LimitLoadToSessionType</key>
<string>Aqua</string>
<key>Program</key>
<string>/Applications/Menu.app/Contents/MacOS/Menu</string>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)
要创建.plist,您所要做的就是用这些值填充属性列表字典,并调用dictionary.write(to:atomically:)将其写入其所属的位置。
启动代理是常规用户进程,因此这些都不需要任何特殊权限,尽管我不确定是否~/Library/LaunchAgents从沙盒应用程序写入。
由于用户通常不会摆弄,~/Library/LaunchAgents或者launchctl您的应用程序需要提供用于安装和卸载代理的 UI。对于状态菜单项应用程序,这通常就像“在菜单栏中显示”的首选项复选框一样简单。
[1]bootstrap并bootout在10.11中添加。如果您必须支持早期版本的 macOS,有一些解决方法。
| 归档时间: |
|
| 查看次数: |
1144 次 |
| 最近记录: |