在obj-c中有什么方法可以挂钩到应用程序委托方法

时间:2014-10-17 15:41:22

标签: objective-c push-notification ios8 marmalade-edk

问题是

我使用Marmalade SDK(http://www.madewithmarmalade.com/)。

Marmalade SDK提供了编写特定于平台的插件的机会(其术语中的扩展名)。

每个扩展都编译为静态库,并使用特殊部署工具链接到主应用程序(其术语中为Loader)。

主要应用程序的源未打开,因此我们无法实现/覆盖应用程序委托方法。

我需要一个通过Upsight SDK(以前的PLayhaven)管理远程推送通知的扩展程序。

ios 8来了,需要一些额外的努力来进行远程推送通知注册。特别是,应该实现 didRegisterForRemoteNotificationsWithDeviceToken didRegisterUserNotificationSettings

问题

如何从静态库中注入应用程序委托方法(无法访问主应用程序的源代码)?

想法是

1)使用类别。我试图向UIApplication类添加新方法,然后用原始方法交换它们。我的新方法完成了他们的工作,然后调用了原始方法。但它似乎不起作用。 我的obj-c体验很差。我的课程扩展是错误的实现或原始想法是不正确的:

   @interface UIApplication(MyDelegate)
    - (void)application:(UIApplication *)application newDidRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings;
    @end

    @implementation UIApplication(MyDelegate)
    - (void)application:(UIApplication *)application newDidRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
    {
        NSLog(@"PLAYHAVEN: didRegisterUserNotificationSettings:%@", notificationSettings);
        [[PHPushProvider sharedInstance] registerUserNotificationSettings:notificationSettings];
    }
    @end

    s3eResult s3ePlayhavenInit_platform()
    {

        // Add any platform-specific initialisation code here
        myDelegate = [[MyDeleagte alloc] init];

        oldHandler1 = class_getInstanceMethod([UIApplication class], @selector(application:didRegisterUserNotificationSettings:));
        newHandler1 = class_getInstanceMethod([UIApplication class], @selector(application:newDidRegisterUserNotificationSettings:));
        method_exchangeImplementations(oldHandler1, newHandler1);

        ...
        return S3E_RESULT_SUCCESS;
    }

2)使用NSNotificationCenter听取相应的通知:

[[NSNotificationCenter defaultCenter] addObserver:myDelegate selector:@selector(didRegisterUserNotificationSettings:) name:@"UIApplicationDidRegisterUserNotificationSettings" object:nil];

但我不确定是否会发布具有此类名称的通知。我没有在UIApplication类中找到任何相关的常量。结果,这也行不通。

最后一个问题是:

有可能吗? 有什么想法吗?

谢谢大家。

1 个答案:

答案 0 :(得分:0)

此技术(1)将与 didRegisterUserNotificationSettings 功能分开工作是 UIApplicationDelegate 的一部分。获得正确委托的技巧是挂钩 UIApplication setDelegate 函数,然后在委托类上进行方法调整。