1

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

我考虑过的一些选项:

  • 解析源代码,并在正确的位置插入行。(可能很难正确地为每个人的代码工作,几乎等同于编写编译器......)
  • 子类化 AppDelegate 文件(这可能吗?)
  • 分类??

其中哪一个是最佳选择?还有其他建议吗?

4

2 回答 2

1

如果您确实需要AppDelegate在开发人员完全不干预的情况下修改它,并且您可以修改 xcodeproj 和 nib 但不能修改源代码,那么有一种方法可以做到。

首先,确保你的类被编译进去,并且你的类的一个实例被创建在 nib 中。

现在,这就是你要做的:

  • 定义一个-[AHHackClass applicationDidFinishLaunching]方法来完成你的额外工作,然后调用[self originalApplicationDidFinishLaunching].
  • -[AHHackClass awakeFromNib:]中,使用 objc 运行时调用将-[AHHackClass applicationDidFinishLaunching]方法复制到应用程序委托 as -[originalApplicationDidFinishLaunching],然后使用方法调配来交换两个方法的实现。
  • 做同样的事情来调酒applicationWillTerminate

参见JRSwizzle一些使方法更容易调动的代码,并MethodSwizzling在 CocoaDev获得一些背景知识。

但是,可能有更简单的方法可以做到这一点:您的额外内容真的需要从应用程序委托applicationDidFinishLaunchingapplicationWillTerminate方法中调用吗?难道你不能设置为监听你的通知并在awakeFromNib那里处理事情吗?

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

于 2013-02-14T20:53:42.077 回答
0

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

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

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

于 2013-02-14T21:00:11.617 回答