【发布时间】:2020-09-07 22:41:09
【问题描述】:
这真是一个奇怪的情况。 我的应用程序是与我的 driverkit 驱动程序通信的用户代理,根据我们的设计,这个应用程序(名为 myAgent.app)会激活我的驱动程序(名为 myDriverKit),因为 myAgent.app 启动然后与 myDriverKit 通信。在我们的测试中我通过plist手动加载,内容为:
<?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>Label</key>
<string>com.myCom.myApp</string>
<key>ProgramArguments</key>
<array>
<string>/Applications/myApp.app/Contents/Helper/myAgent.app/Contents/MacOS/myAgent</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
</dict>
</plist>
一切运行良好(当我们尚未获得授权时,在 SIP 关闭的情况下)。
然后我们打包它,myDriverKit在安装过程中激活后看起来运行良好,安装后脚本最后写:
CONSOLE_USER=$(stat -f%Su /dev/console)
su -l "$CONSOLE_USER" -c '/bin/launchctl load /Library/LaunchAgents/com.myCom.myAgent.plist' 2> /dev/null
但是重启后,myDriverKit 不再工作了!当我使用systemextensionctl list 查找它时,它看起来像生存,但是检查控制台,通过日志流挂钩它,我再也找不到它了。除非我手动执行systemextensionctl reset 并重新启动 myAgent.app 以使其能够永久存在。
我做了几个测试:
- 安装完成后不要自动启动ctl load myAgent,而是自己手动加载 -> 可以。
-
chmod 644 com.myCom.myAgent.plist然后重新构建包 -> 失败 - 不允许 myDriverKit 在安全中,然后在重新启动后允许它 -> 有效
- 在安装后脚本中改用
/usr/bin/sudo -u $USER /bin/launchctl load -S Aqua /Library/LaunchAgents/com.kensington.trackballworks.plist->失败
似乎 myAgent.app 由安装脚本启动与我自己启动不同。可能的根本原因是什么?它可能在 post 脚本中还是在 myAgent.app 激活过程中?如果有任何回复 Orz 表示感谢。
【问题讨论】:
-
这是什么 macOS 版本?如果它是测试版,您是否检查过发行说明,以防已知问题涉及此问题?您是否检查过您的 dext 是否只是崩溃了?
-
我们在 10.15.6 上测试它。我确定系统重新启动时我的 dext 不会崩溃。但是我得到了一些东西...我的安装程序起源于安装 .kext,它与 dext 拥有相同的功能,在我们的设计中,当操作系统为 10.15.6 以上时,kext 在 postinstall 脚本中是
kextunload和rm。如果我从 .pkg 中删除 kext,这种情况就不会再发生了。 -
所以现在我试图找到一种方法,当操作系统高于 10.15.6 时,不将 kext 放入 /Library/Extension ......因此我可以避免这种状态。帮助!我好几个星期都睡不好觉!
-
将您不想在 10.15.6+ 上安装的 kext 放在它们自己的子 .pkg 中,并且仅在旧版本的整体分发 pkg 中启用该选择。但是,如果操作系统随后由用户更新,您可能需要更新您的软件以删除任何剩余的 kext。 (即用户在 10.15.5 上安装您的驱动程序,使用 kext;用户更新到 10.15.6,现在应该使用 dext,因此您的软件需要检测到这一点并删除 kext)您也可以尝试更改探测分数
-
是的菲尔,你是对的!我正在尝试将我的 kext 变成 .pkg 作为我的分发包的一个组件...我不熟悉 pkgbuild->productbuild 过程...需要更多时间来构建和测试...Orz跨度>
标签: objective-c macos driverkit