这真是一个奇怪的情况。我的应用程序是与我的 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 以使其能够永久存在。
我做了几个测试:
- 不要自动launchctl 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。