objective-c - DriverKit 在安装程序安装激活后消失了
问题描述
这真是一个奇怪的情况。我的应用程序是与我的 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。
解决方案
我会自己回答这个问题。这种奇怪情况的根本原因是安装程序处理时用户激活(在安全中单击允许按钮的那一刻)dext kextcache
。
如果我们在 .pkg 中指定要复制到 /Library/Extensions/ 的 kext,安装程序将kextcache
在安装过程中自动执行。这就是安装程序需要很长时间才能完成安装的原因。
如果用户在kextcache
处理过程中激活了一个 dext,则该 dext 似乎可以工作,但在重新启动后,该 dext 不会影响任何事情,即使它在systemextensionctl list
发出时显示“已激活”。
在我看来,这应该是 macOS 中的一个错误。
推荐阅读
- android - Android:有没有办法将 ItemTouchHelper.SimpleCallback 对象附加到单个 CardView?
- javascript - 提示框 - 当前日期格式
- excel - 在办公室 JS 加载项中,我如何删除不确定是否存在的工作表?
- c# - 如何在宏的坐标上保持检查颜色?
- python - 如何在不使用 elif 的情况下增加值?
- javascript - 向 OneSignal 推送通知发送 POST 请求
- binary - 关于大端与小端的问题
- php - 多个日期选择器实例,更新数据库
- python - 正确的python代码一起输入两次没有错误
- vba - 将范围粘贴到前景中作为图片