问题是:
我使用 Marmalade SDK ( http://www.madewithmarmalade.com/ )。
Marmalade SDK 提供了编写特定于平台的插件(在其术语中的扩展)的机会。
每个扩展都被编译为静态库,并使用特殊的部署工具链接到主应用程序(术语中的加载器)。
主应用程序的源没有打开,因此我们无法实现/覆盖应用程序委托方法。
我需要一个扩展来通过 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 类中找到任何相关的常量。结果,这也行不通。
最后一个问题是:
有可能吗?有任何想法吗?
谢谢大家。