2

我想将较新版本的包加载到目标进程,但这是不可能的,因为已经加载了同名的包。更改CFBundleVersionCFBundleShortVersionString捆绑包不起作用。最简单的方法是简单地杀死目标进程并重新启动它。但我认为这不是最好的方法。那么还有另一种方法吗?

4

1 回答 1

3

mach_inject 我也面临同样的问题。如果不修改 mach_inject,我看不到直接的解决方案。

我的解决方案是创建两个捆绑包。将第一个捆绑包视为真正插件的插件管理器。插件管理器非常简单,希望永远不需要升级,它加载和卸载原始包并添加了清理代码。

我正在使用 Apple 的 NSBundle 类来加载和卸载插件。在卸载之前,我调用原始插件中的主体类来清理它。

卸载用目标 C 编写的包是危险的。2 & 4 大体上是对的。

  1. mach_override 不可撤销,但可以在插件管理器中调用,在真实插件中调用代码。
  2. 在要卸载的插件中使用类别和协议是不安全的。
  3. 你需要取消调配你调配的东西,记住你不能删除方法,所以当你重新加载插件时,你需要替换(而不是添加)旧的悬空方法。您将需要检查您的调酒代码。
  4. 您需要使安装的计时器无效,删除观察者,并删除添加到运行循环中的任何其他内容。
于 2013-02-22T17:12:32.800 回答