是否可以刷新应用程序:didReceiveRemoteNotification:



我目前正在开发一个产品,该产品需要刷新AppDelegate的应用程序:didReceiveRemoteNotification:(我不想在AppDelegate本身中调用我的新方法)。

问题是:嗖嗖的一声根本不起作用。我以前已经成功地研究了好几次方法,而这一次,根本没有调用替换实现。我想知道这是否是因为appDelegate方法的某些特殊性,因为这些方法是由系统调用的,而不是由应用程序调用的。

我将假设您的问题中缺少的大部分内容,只要可能,总是用代码示例发布问题是一个好主意。

  1. 您需要确保您的方法是针对UIApplicationDelegate的特定实现而不是UIApplicationDelegate本身进行的。例如

    @interface AppDelegate : UIResponder <UIApplicationDelegate>
    @end
    

    在这种情况下,您需要刷新AppDelegate类。

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

编辑

上述方法有一些缺点,

  1. 它对应用程序代码可访问的所有类进行迭代,对所有这些类进行循环并不是一个高性能的解决方案。

  2. 许多著名的SDK都会刷新或动态扩展AppDelegate,因为在这个地方可以截获很多有趣的东西。这也意味着您的应用程序可能有不止一个UIApplicationDelegate协议的实现,而上面的代码可能只是选择它的任何实现,从而导致一些严重的问题。

正如Chris在下面的评论中所建议的那样,只使用[[UIApplication sharedApplication].delegate class]更安全、更高效。它应该为您提供iOS应用程序在调用这行代码时已知的确切AppDelegate实现。

相关内容

  • 没有找到相关文章

最新更新