你可以swizzle应用程序:didReceiveRemoteNotification:

我目前正在研究一个需要调用AppDelegate应用程序的产品:didReceiveRemoteNotification :(我不想在appDelegate本身中调用我的新方法)。

问题是:混合游戏根本不起作用。 我已经多次调用方法成功,这次replace实现根本就没有被调用。 我想知道是否是因为appDelegate的方法的一些特殊性,因为这些是由系统调用,而不是应用程序。

我将假设大部分在你的问题中缺less的东西,它是一个好主意,只要有可能就总是用代码示例发表问题。

  1. 你需要确保你在UIApplicationDelegate的具体实现上调用你的方法,而不是UIApplicationDelegate本身。 例如

    @interface AppDelegate : UIResponder <UIApplicationDelegate> @end 

    在这种情况下,你需要调整AppDelegate类。

  2. 另外,如果你正在编写一个静态库/框架,你可能根本不知道这个类的名字。 在这种情况下,最简单/最安全的方法是请求应用程序的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]; } } 

编辑

上述方法有一些缺点,

  1. 它遍历所有应用程序代码可访问的类,循环遍历所有这些类不是一个高性能的解决scheme。

  2. 许多着名的SDK会调整或dynamic扩展你的AppDelegate ,因为很多有趣的事情可以在这个地方被截获。 这也意味着你的应用程序可能有多个UIApplicationDelegate协议的实现,上面的代码可能只是select它的任何实现,从而导致一些严重的问题。

正如Chris在下面的评论中所build议的那样,只要使用[[UIApplication sharedApplication].delegate class] ,它[[UIApplication sharedApplication].delegate class]安全,更[[UIApplication sharedApplication].delegate class] 。 在调用这行代码的时候,它应该给你iOS应用程序已知的确切的AppDelegate实现。