以编程方式修改某人AppDelegate - 类别,子类?

时间:2013-02-14 20:37:08

标签: python ios objective-c

我正在研究框架安装程序脚本。该脚本需要修改用户AppDelegate文件,并在applicationDidFinishLaunching和applicationWillTerminatate方法的开头或结尾注入几行代码。

我想过的一些选项:

  • 解析源代码,并在正确的位置插入行。 (可能很难做到正确并且适合每个人的代码,只相当于编写编译器......)
  • 对AppDelegate文件进行子类化(这可能吗?)
  • 分类??

哪一个是最好的选择?还有其他建议吗?

2 个答案:

答案 0 :(得分:1)

如果你确实需要在没有开发人员干预的情况下修改AppDelegate,你可以修改xcodeproj和nib而不是源代码,有一种方法可以做到。

首先,确保编译您的类,并在nib中创建类的实例。

现在,这就是你做的事情:

  • 定义执行额外内容的-[AHHackClass applicationDidFinishLaunching]方法,然后调用[self originalApplicationDidFinishLaunching]
  • -[AHHackClass awakeFromNib:]中,使用objc运行时调用将-[AHHackClass applicationDidFinishLaunching]方法复制到应用程序委托为-[originalApplicationDidFinishLaunching],然后使用方法调配来交换这两种方法的实现。
  • 做同样的动作applicationWillTerminate

请参阅JRSwizzle了解一些让方法更容易调整的代码,以及MethodSwizzling at CocoaDev的某些背景知识。

但是,可能有一种更简单的方法:您是否真的需要从应用委托的applicationDidFinishLaunchingapplicationWillTerminate方法调用额外的内容?您是否可以设置为在awakeFromNib中收听通知并处理其中的内容?

如果由于某种原因,您不能这样做,您是否可以在开发人员的说明中插入一行来从他们的applicationDidFinishLaunching方法调用您的方法?

答案 1 :(得分:0)

我目前正在考虑的一个解决方案:

  1. 添加子类AppDelegate的NewAppDelegate.m / h文件。
  2. 这个子类,做我想要的,然后调用超级方法。
  3. 使用main.m
  4. 中的NewAppDelegate.m.h查找/替换AppDelegate

    这看起来非常简单和强大。对此的想法?这适用于所有/大多数项目吗?