我正在开发框架安装程序脚本。该脚本需要修改用户的 AppDelegate 文件,并在 applicationDidFinishLaunching 和 applicationWillTerminatate 方法的开头或结尾注入(inject)几行代码。
我考虑过的一些选项:
- 解析源代码,并在正确的位置插入行。 (可能很难正确处理每个人的代码,几乎等同于编写编译器...)
- 子类化 AppDelegate 文件(这可能吗?)
- 类别??
哪一个是最好的选择?还有其他建议吗?
最佳答案
如果你真的需要在开发人员完全不干预的情况下修改 AppDelegate
,并且你可以修改 xcodeproj 和 nib 但不能修改源代码,有一种方法可以做吧。
首先,确保您的类已被编译,并且您的类的实例已在 nib 中创建。
现在,这是你要做的:
- 定义一个
-[AHHackClass applicationDidFinishLaunching]
方法来执行您的额外操作,然后调用[self originalApplicationDidFinishLaunching]
。 - 在
-[AHHackClass awakeFromNib:]
中,使用 objc 运行时调用将-[AHHackClass applicationDidFinishLaunching]
方法复制到应用程序委托(delegate)作为-[originalApplicationDidFinishLaunching]
,然后使用 method swizzling 交换两个方法的实现。 - 对
applicationWillTerminate
执行相同的操作。
参见 JRSwizzle
对于一些使方法调配更容易的代码,以及 MethodSwizzling
at CocoaDev一些背景。
但是,可能有更简单的方法来做到这一点:是否真的需要从应用委托(delegate)的 applicationDidFinishLaunching
和 applicationWillTerminate
方法中调用额外的东西?您不能在 awakeFromNib
中设置监听通知并在那里处理事情吗?
如果由于某种原因您不能这样做,您能否在说明中添加一行代码,让开发人员从他们的 applicationDidFinishLaunching
方法中调用您的方法?
关于python - 以编程方式修改某人的 AppDelegate - 类别,子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14883568/