你可以swizzle应用程序:didReceiveRemoteNotification:
我目前正在研究一个需要调用AppDelegate应用程序的产品:didReceiveRemoteNotification :(我不想在appDelegate本身中调用我的新方法)。
问题是:混合游戏根本不起作用。 我已经多次调用方法成功,这次replace实现根本就没有被调用。 我想知道是否是因为appDelegate的方法的一些特殊性,因为这些是由系统调用,而不是应用程序。
我将假设大部分在你的问题中缺less的东西,它是一个好主意,只要有可能就总是用代码示例发表问题。
-
你需要确保你在UIApplicationDelegate的具体实现上调用你的方法,而不是UIApplicationDelegate本身。 例如
@interface AppDelegate : UIResponder <UIApplicationDelegate> @end
在这种情况下,你需要调整AppDelegate类。
-
另外,如果你正在编写一个静态库/框架,你可能根本不知道这个类的名字。 在这种情况下,最简单/最安全的方法是请求应用程序的AppDelegate名称,并通过NSClassFromString()来检索特定的类实例,或者你可以蛮力地find你需要的类(因为你通常只有一个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]; } }
编辑
上述方法有一些缺点,
-
它遍历所有应用程序代码可访问的类,循环遍历所有这些类不是一个高性能的解决scheme。
-
许多着名的SDK会调整或dynamic扩展你的
AppDelegate
,因为很多有趣的事情可以在这个地方被截获。 这也意味着你的应用程序可能有多个UIApplicationDelegate
协议的实现,上面的代码可能只是select它的任何实现,从而导致一些严重的问题。
正如Chris在下面的评论中所build议的那样,只要使用[[UIApplication sharedApplication].delegate class]
,它[[UIApplication sharedApplication].delegate class]
安全,更[[UIApplication sharedApplication].delegate class]
。 在调用这行代码的时候,它应该给你iOS应用程序已知的确切的AppDelegate实现。