【问题标题】:Can you swizzle application:didReceiveRemoteNotification:你可以调整应用程序:didReceiveRemoteNotification:
【发布时间】:2013-12-09 23:41:12
【问题描述】:

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

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

【问题讨论】:

  • 我认为 Apple 不喜欢你调配他们的 API:stackoverflow.com/questions/7720947/method-swizzling-in-ios-5
  • 根据定义,您在自己的应用程序中拥有应用程序委托的实现,因此无需进行调配。现在,如果您谈论的是调配其他应用程序的实现,那么,不,您不能那样做。
  • 在您定义的类中调配方法没有多大意义。如果您不想要应用程序委托中的代码,请将其放在您从那里调用的其他方法中,或者发布其他对象收到的通知。
  • @Alex,您共享的链接不适用于此问题,因为该问题清楚地表明它试图交换 application:didReceiveRemoteNotification: 这不是由 Apple 实现的,它是记录在案的回调而不是实现(不像你的链接提到的dealloc。)

标签: ios iphone objective-c swizzling


【解决方案1】:

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

  1. 您需要确保您在 UIApplicationDelegate 的特定实现而不是 UIApplicationDelegate 本身上调整您的方法。例如

    @interface AppDelegate : UIResponder <UIApplicationDelegate>
    @end
    

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

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

编辑

上述方法有一些缺点,

  1. 它会遍历应用程序代码可访问的所有类,循环遍历所有这些类并不是一个高效的解决方案。

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

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

【讨论】:

  • 为什么不直接使用[[UIApplication sharedApplication].delegate class]
  • @ChrisH,使用您分享的方式更加安全和高效,我应该相应地更新我的答案。
猜你喜欢
  • 2019-04-08
  • 1970-01-01
  • 2017-10-13
  • 1970-01-01
  • 2020-05-09
  • 1970-01-01
  • 2014-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多