Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在obj-c中有什么方法可以钩住应用程序委托方法吗_Objective C_Push Notification_Ios8_Marmalade Edk - Fatal编程技术网

Objective c 在obj-c中有什么方法可以钩住应用程序委托方法吗

Objective c 在obj-c中有什么方法可以钩住应用程序委托方法吗,objective-c,push-notification,ios8,marmalade-edk,Objective C,Push Notification,Ios8,Marmalade Edk,问题是: 我使用果酱SDK() MarmaladeSDK提供了编写特定于平台的插件的机会(扩展了它们的术语) 每个扩展都被编译为静态库,并使用特殊的部署工具链接到主应用程序(用它们的术语来说是加载器) 主应用程序的源未打开,因此我们无法实现/重写应用程序委托方法 我需要一个通过Upsight SDK(以前的PLayhaven)管理远程推送通知的扩展 ios 8推出后,需要进行一些额外的远程推送通知注册工作。特别是,应该实现DidRegisterForRemotionTificationsWith

问题是

我使用果酱SDK()

MarmaladeSDK提供了编写特定于平台的插件的机会(扩展了它们的术语)

每个扩展都被编译为静态库,并使用特殊的部署工具链接到主应用程序(用它们的术语来说是加载器)

主应用程序的源未打开,因此我们无法实现/重写应用程序委托方法

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

ios 8推出后,需要进行一些额外的远程推送通知注册工作。特别是,应该实现DidRegisterForRemotionTificationsWithDeviceToken和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类中找到任何相关的constans。因此,这也不起作用

最后一个问题是:

有可能吗? 有什么想法吗

谢谢大家。

此技术(1)将与didRegisterUserNotificationSettings功能分开使用,它是UIApplicationLegate的一部分。获取正确委托的技巧是钩住UIApplication的setDelegate函数,然后在委托类上执行方法swizzling