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

标签 python ios objective-c

我正在开发框架安装程序脚本。该脚本需要修改用户的 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)的 applicationDidFinishLaunchingapplicationWillTerminate 方法中调用额外的东西?您不能在 awakeFromNib 中设置监听通知并在那里处理事情吗?

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

关于python - 以编程方式修改某人的 AppDelegate - 类别,子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14883568/

相关文章:

ios - 使用 PlistBuddy 获取应用程序版本返回 "CFBundleShortVersionString does not exist"

python - hdbscan 问题(ValueError : numpy. ndarray 大小已更改,可能表示二进制不兼容。预计来自 C header 的 88,来自 PyObject 的 80)

python - python 复制文件夹及其内容的函数

ios - 从 NSObject 类中呈现一个 View Controller

ios - 禁止在iOS 9上打开3D触摸屏?

ios - 在自己创建的多个线程中执行核心数据操作以节省处理时间

ios - 如何在 NSMutableArray 中找到 Id 的位置

objective-c - 如何使用 JSONModel 将 NSArray 序列化为 JSON

python - 有谁知道如何在python中绘制线性回归曲线或相关函数来绘制它?

python - 用整数列表/元组替换 Pandas DataFrame 列中的值