代码之家  ›  专栏  ›  技术社区  ›  jl303

Swift 4中的MenuApp在登录High Sierra时运行?

  •  5
  • jl303  · 技术社区  · 8 年前

    我的应用程序是一个菜单应用程序,位于后台运行的菜单附加程序中,我正在尝试使其在登录时运行。使用Swift 4为High Sierra实现这一目标的最新推荐做法是什么?

    根据 Designing Daemons and Services ,MacOS上有四个不同的后台进程。

    因为我希望我的应用程序在用户登录时运行,所以我猜它将是登录项或启动代理。然而,对于登录项,似乎有 two ways to implement 使用服务管理框架或共享文件列表。

    我首先尝试使用共享文件列表,基于此 example 来自github。然而,Xcode抛出了大量不推荐的警告和错误,表明它不再支持Swift 4和最新的MacOS。

    然后我使用SMLoginItemSetEnabled从 this guide . 但是,使用此方法,我的应用程序不会显示在登录项下的系统首选项中。

    对于Swift 4和High Sierra,共享文件列表方法是否完全不可用?

    launch agent呢?我找不到太多关于使用Swift作为发布代理制作应用程序的指南。如果有人能分享一些代码,我将不胜感激。

    谢谢

    2 回复  |  直到 8 年前
        1
  •  1
  •   James Bucanek    8 年前

    我建议创建一个启动代理。登录项为sooo 2010;)。

    实际上没有用于创建启动代理(或其他)的API launchd 服务)。这些步骤基本上是:

    1. 创建并编写适当的 ~/Library/LaunchAgents/com.your.agent.plist 文件
    2. 处决 /bin/launchctl bootstrap gui/501 ~/Library/LaunchAgents/com.your.agent.plist

    (其中 501 和 通用域名格式。你的代理人 是用户的UID和您的启动标识符)

    第二步有些可选;系统将看到 .plist 文件并在下次系统重新启动时自动启动代理。因此,您可以通过第一次手动启动它来启动它。但如果你想立即注册 启动 (例如,如果退出,它将自动重新启动),那么我知道除了运行 launchctl 注册一次。(同样,您需要运行 launchctl bootout ... 在卸载时将其关闭。[1])

    的详细信息 .普利斯特 文件位于 man launchd.plist ,但这里有一个 LSUIElement 每当用户登录到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>
    

    要创建 .普利斯特 ,只需使用这些值填充属性列表字典并调用 dictionary.write(to:atomically:) 把它写在该写的地方。

    启动代理是常规的用户进程,因此这些都不需要任何特权,尽管我不确定是否要写入 ~/Library/LaunchAgents 来自沙盒应用程序。

    因为用户通常不会 ~/库/启动代理 或 启动CTL 您的应用程序需要提供用于安装和卸载代理的UI。对于状态菜单项应用程序,这通常与“在菜单栏中显示”的首选项复选框一样简单。

    [1] bootstrap 和 bootout 在10.11中添加。如果您必须支持早期版本的macOS,那么有一些解决方法。

        2
  •  1
  •   vadian    8 年前

    特别是对于沙盒应用程序,建议使用服务管理框架( SMLoginItemSetEnabled )以及位于 ./Contents/Library/LoginItems

    当然,应用程序不会出现在系统首选项的登录项中,因为行为应该在应用程序本身中进行控制。