参考文章:
一、iOS10 关于推送
二、iOS10通知框架UserNotification理解与应用
注:此文只能适配iOS10及以上的系统,如果需要适配iOS9及以下的系统可读下面的文章。
iOS8的推送方法可以查看:iOS8-推送(本地和远程)的简单使用
在iOS10中,把远程推送和本地推送整合到了一起,代理方法也是相同的了。所以就一起介绍了。
首先需要添加框架 UserNotifications.framework
(#import
还要遵守通知的代理协议
推送的注册
// 同样是在下面的这个方法中注册
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//进行用户权限的申请
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
center.delegate = self; // 遵守代理协议
[center requestAuthorizationWithOptions:UNAuthorizationOptionBadge|UNAuthorizationOptionSound|UNAuthorizationOptionAlert|UNAuthorizationOptionCarPlay completionHandler:^(BOOL granted, NSError * _Nullable error) {
//在block中会传入布尔值granted,表示用户是否同意
if (granted) {
//点击允许
NSLog(@"注册通知成功");
} else {
//点击不允许
NSLog(@"注册通知失败");
}
}];
// 如果是注册远程推送,还是和以前一样,需要加上下面这行代码
[[UIApplication sharedApplication] registerForRemoteNotifications];
return YES;
}
获取用户对通知的设置信息 的方法也不再是原来的方法了。
iOS10以前是一个代理方法:
/** 获取用户对通知的设置信息 */
//NS_AVAILABLE_IOS(8_0);
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
NSLog(@"setting=== %@",notificationSettings);
}
iOS10之后变成了一个实例方法,上面的代理方法不会运行:
[center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
NSLog(@"%@", settings);
}];
关于注册远程通知的回调方法还是和以前一样:
/** 远程通知注册成功委托 */ //NS_AVAILABLE_IOS(3_0);
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
// 对 deviceToken 进行处理
NSString *token = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
token = [token stringByReplacingOccurrencesOfString:@" " withString:@""];
// 需要把 deviceToken 上传给服务器
/**上传deviceToken的代码*/
}
/** 远程通知注册失败委托 */ //NS_AVAILABLE_IOS(3_0);
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
NSLog(@"%@",error);
}
接下来是iOS10中收到推送通知的方法回调,也是在日常使用中和之前完全不一样的地方。
在iOS10之前的系统中,本地推送通知和远程推送的收到推送通知的方法回调是分开的,而且如果携带的 Category参数的话,回调方法也是和没有携带参数的方法不同。
但是在iOS10中,无论是本地推送通知还是远程推送通知,无论有没有携带 Category参数,调用的方法都是一样的:
#pragma mark --- iOS 10.0
// 程序在前台的时候对通知的处理。
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
NSLog(@"=== willPresentNotification");
}
// 程序在后台但是点击了收到的推送通知打开程序
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
NSLog(@"=== didReceiveNotificationResponse");
//处理完消息,最后一定要调用这个代码块
completionHandler();
}
获取和删除通知
这里通知有两种状态:
Pending 等待触发的通知
Delivered 已经触发展示在通知中心的通知
//获取未触发的通知
[[UNUserNotificationCenter currentNotificationCenter] getPendingNotificationRequestsWithCompletionHandler:^(NSArray * _Nonnull requests) {
NSLog(@"pending: %@", requests);
}];
//获取通知中心列表的通知
[[UNUserNotificationCenter currentNotificationCenter] getDeliveredNotificationsWithCompletionHandler:^(NSArray * _Nonnull notifications) {
NSLog(@"Delivered: %@", notifications);
}];
//清除某一个未触发的通知
[[UNUserNotificationCenter currentNotificationCenter] removePendingNotificationRequestsWithIdentifiers:@[@"TestRequest1"]];
//清除某一个通知中心的通知
[[UNUserNotificationCenter currentNotificationCenter] removeDeliveredNotificationsWithIdentifiers:@[@"TestRequest2"]];
//对应的删除所有通知
[[UNUserNotificationCenter currentNotificationCenter] removeAllPendingNotificationRequests];
[[UNUserNotificationCenter currentNotificationCenter] removeAllDeliveredNotifications];
创建普通的本地通知
//通知内容类
UNMutableNotificationContent * content = [UNMutableNotificationContent new];
//设置通知请求发送时 app图标上显示的数字
content.badge = @2;
//设置通知的内容
content.body = @"这是iOS10的新通知内容:普通的iOS通知";
//默认的通知提示音
content.sound = [UNNotificationSound defaultSound];
//设置通知的副标题
content.subtitle = @"这里是副标题";
//设置通知的标题
content.title = @"这里是通知的标题";
//设置从通知激活app时的launchImage图片
content.launchImageName = @"lun";
//设置5S之后执行
UNTimeIntervalNotificationTrigger * trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:5 repeats:NO];
UNNotificationRequest * request = [UNNotificationRequest requestWithIdentifier:@"NotificationDefault" content:content trigger:trigger];
//添加通知请求
[[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
}];
iOS10的新特性
以上就是关于iOS10推送的简单使用。当然iOS10的推送相比以前的功能更加丰富了,比如:
1.UserNotification支持自定义通知音效和启动图。
2.UserNotification支持向通知内容中添加媒体附件,例如音频,视频。
3.UserNotification支持开发者定义多套通知模板。
4.UserNotification支持完全自定义的通知界面。
5.UserNotification支持自定义通知中的用户交互按钮。
关于这些功能,因为目前暂时没有用到,可以查看我上面列出的参考文章:
iOS10通知框架UserNotification理解与应用