在 iOS 应用中响应推送通知通常需要 a) 使用 NSNotificationCenter 或 b) 在其代理中维护对与应用无关部分的引用。这可能是更好的,因为您不必做这两者中的任何一个,也不必传递字典。
您必须为您希望处理的每种通知类型创建 NPLRemoteNotification
的一个子类。通过重写 +keyPathsToNotificationKeys
通知将 userInfo
映射到您子类的属性。
MyNotification.h
#import <NPLRemoteNotificationManager/NPLRemoteNotification.h>
@interface MyNotification : NPLRemoteNotification
@property (nonatomic, strong) NSString *myProperty;
@end
MyNotification.m
#import "MyNotification.h"
@implementation MyNotification
+ (NSDictionary *)keyPathsToNotificationKeys
{
return @{
@"myProperty" : @"server_property"
};
}
@end
为了正确处理通知,您必须将 NPLRemoteNotification
的子类注册到 NPLRemoteNotificationManager
单例。
示例应用程序委托
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
...
[[NPLRemoteNotificationManager sharedManager] registerNotificationClass:[MyNotification class]];
...
}
只需将通知转发到 NPLRemoteNotificationManager
单例。通知的类将自动根据您在 NPLRemoteNotification
子类上的 +keyPathsToNotificationKeys
中提供的键路径推断出来。
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
BOOL result = [[NPLRemoteNotificationManager sharedManager] handleNotificationWithUserInfo:userInfo applicationState:[application applicationState]];
if (!result) {
NSLog(@"Received unknown notification");
}
}
对这些通知的响应非常简单。只需在需要通知的类的实例上实现 NPLRemoteNotificationObserver
并将其注册到 NPLRemoteNotificationManager
单例。
示例视图控制器
#import "MyViewController.h"
#import <NPLRemoteNotificationManager/NPLRemoteNotificationManager.h>
#import "MyNotification.h"
@implementation MyViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[[NPLRemoteNotificationManager sharedManager] addObserver:self forNotificationClass:[MyNotification class]];
}
- (void)dealloc
{
[[NPLRemoteNotificationManager sharedManager] removeObserver:self];
}
@end
#pragma mark - NPLRemoteNotificationObserver
- (void)notificationManager:(NPLRemoteNotificationManager *)manager
receivedNotification:(NPLRemoteNotification *)notification
applicationState:(UIApplicationState)applicationState
{
if ([notification isKindOfClass:[MyNotification class]]) {
MyNotification *myNotification = (MyNotification *)notification;
// Do what you want with it
NSLog(@"lulzzzzzz: %@", [myNotification myProperty]);
}
}
Nick Lee, [email protected]
NPLRemoteNotificationManager 在 MIT 许可下提供。有关更多信息,请参阅 LICENSE 文件。