我目前正在开发一种需要调整 AppDelegate 应用程序的产品:didReceiveRemoteNotification:(我不想在 appDelegate 本身中调用我的新方法)。
问题是:调酒根本行不通。我之前已经成功地调配了好几次方法,而这一次,替换实现根本没有被调用。我想知道这是否是因为 appDelegate 方法的某些特殊性,因为这些方法是由系统调用的,而不是由应用程序调用的。
我目前正在开发一种需要调整 AppDelegate 应用程序的产品:didReceiveRemoteNotification:(我不想在 appDelegate 本身中调用我的新方法)。
问题是:调酒根本行不通。我之前已经成功地调配了好几次方法,而这一次,替换实现根本没有被调用。我想知道这是否是因为 appDelegate 方法的某些特殊性,因为这些方法是由系统调用的,而不是由应用程序调用的。
我将假设您的问题中缺少的大部分内容,尽可能始终使用代码示例发布问题是一个好主意。
您需要确保您在 UIApplicationDelegate 的特定实现而不是 UIApplicationDelegate 本身上调整您的方法。例如
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@end
在这种情况下,您需要调整 AppDelegate 类。
此外,如果您尝试编写静态库/框架,您可能根本不知道此类的名称。在这种情况下,最简单/最安全的方法是询问 App 的 AppDelegate 名称并使用它来通过 NSClassFromString() 检索特定的类实例,或者您可以蛮力找到您需要的类(因为您通常有一个单一的 AppDelegate 类)。
unsigned int numberOfClasses = 0;
Class *classes = objc_copyClassList(&numberOfClasses);
Class appDelegateClass = nil;
for (unsigned int i = 0; i < numberOfClasses; ++i) {
if (class_conformsToProtocol(classes[i], @protocol(UIApplicationDelegate))) {
appDelegateClass = classes[i];
}
}
编辑
上述方法有几个缺点,
它遍历应用程序代码可访问的所有类,循环遍历所有这些类并不是一个高性能的解决方案。
许多著名的 SDK 会调配或动态扩展您AppDelegate
的 . 这也意味着您的应用程序可能有多个UIApplicationDelegate
协议实现,而上面的代码可能只会选择它的任何实现,从而导致一些严重的问题。
正如 Chris 在下面的评论中所建议的那样,仅使用[[UIApplication sharedApplication].delegate class]
. 在调用这行代码时,它应该为您提供 iOS 应用程序已知的确切 AppDelegate 实现。