关于远程推送的相关配置网上已经有足够多的教程,这里就不复述了。这里讲述当客户端收到推送消息后,应怎样对其进行相应的逻辑处理。
工程的AppDelegate.m文件里提供了如下方法:
//当应用程序启动后,可能需要进行其他逻辑处理时调用的方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
//成功注册registerUserNotificationSettings:后,回调的方法
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings;
/// 注册失败调用
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error;
/// 用户同意接收通知后,会调用此程序
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken;
//收到推送后调用的方法(iOS 10 及以上)
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler;
//收到推送后调用的方法(iOS 10 以下)
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler;
//应用挂起前调用的方法(当有电话进来或者锁屏,应用会挂起)
- (void)applicationWillResignActive:(UIApplication *)application;
//当程序复原或启动时调用的方法
- (void)applicationDidBecomeActive:(UIApplication *)application;
//应用将要进入后台调用的方法
- (void)applicationWillEnterForeground:(UIApplication *)application;
//应用进入后台调用的方法
-(void)applicationDidEnterBackground:(UIApplication *)application;
//应用将要退出
- (void)applicationWillTerminate:(UIApplication *)application;
首先为应用程序注册通知:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSDictionary *remoteNotification = [launchOptions objectForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"];
if (remoteNotification != nil) {
self.isLaunchedByNotification = YES;
}else{
self.isLaunchedByNotification = NO;
}
self.window=[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
center.delegate = self;
[center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (!error) {
NSLog(@"succeeded!");
}
}];
} else if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0){//iOS8-iOS9
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound) categories:nil];
[application registerUserNotificationSettings:settings];
[application registerForRemoteNotifications];
} else {//iOS8以下
[application registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound];
}
return YES;
}
用户同意后,会调用此程序,获取系统的deviceToken,应把deviceToken传给服务器保存,此函数会在程序每次启动时调用(前提是用户允许通知):
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSLog(@"deviceToken = %@",deviceToken);
NSString *token=[NSString stringWithFormat:@"%@",deviceToken];
token=[token stringByReplacingOccurrencesOfString:@"<" withString:@""];
token=[token stringByReplacingOccurrencesOfString:@">" withString:@""];
token=[token stringByReplacingOccurrencesOfString:@" " withString:@""];
//TODO
//保存到本地并上传到服务器
}
收到推送消息后,进行相应的逻辑处理:
//iOS 10 及以上
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
completionHandler(UIBackgroundFetchResultNewData);
NSDictionary *userInfo = response.notification.request.content.userInfo;
//程序关闭状态点击推送消息打开
if (self.isLaunchedByNotification) {
//TODO
}
else{
//前台运行
if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive) {
//TODO
}
//后台挂起时
else{
//TODO
}
//收到推送消息手机震动,播放音效
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
AudioServicesPlaySystemSound(1007);
}
//设置应用程序角标数为0
[UIApplication sharedApplication].applicationIconBadgeNumber = 9999;
[UIApplication sharedApplication].applicationIconBadgeNumber = 0;
}
//iOS 10 以下
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
completionHandler(UIBackgroundFetchResultNewData);
//程序关闭状态点击推送消息打开
if (self.isLaunchedByNotification) {
//TODO
}
else{
//前台运行
if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive) {
//TODO
}
//后台挂起时
else{
//TODO
}
//收到推送消息手机震动,播放音效
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
AudioServicesPlaySystemSound(1007);
}
//设置应用程序角标数为0
[UIApplication sharedApplication].applicationIconBadgeNumber = 9999;
[UIApplication sharedApplication].applicationIconBadgeNumber = 0;
}
应用进入后台时,设置角标数(应用图标右上角小红点,未读消息数):
-(void)applicationDidEnterBackground:(UIApplication *)application{
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:123];
}