iOS 10 消息推送(UserNotifications)秘籍总结

前言

单独整理消息通知的内容,但是因为工(就)作(是)的(很)事(懒)没有更新文章,违背了自己的学习的初衷。因为互联网一定要有危机意识,说不定眼一睁,我们就欧了 。

iOS 10 消息推送(UserNotifications)秘籍总结 图片来源网络.jpeg

“狼,他没有狮子老虎强壮,也没有大象那庞大的身躯,但至少:我从来没在马戏团看到过他们的身影。”

也许只有狼在一直奔跑,这是我一直喜欢它的原因,要像狼一样不断奔跑,才能幸存!

看完楼主装的一手好X,我来总结一点点你都知道的通知方面的知识点!

iOS 10 消息推送(UserNotifications)秘籍总结 楼主装逼,打他

背景

iOS10 新特性一出,各个大神就早已研究新特性能给场景智能化所带来的好处(唉,可惜我只是一个小白)。我也被安排适配iOS10的推送工作!

Apple 表示这是 iOS 有史以来最大的升级(our biggest release yet),更加智能开放的 Siri 、强化应用对 3D Touch 支持、 HomeKit 、电话拦截及全新设计的通知等等…

iOS 10 中将之前繁杂的推送通知统一成UserNotifications.framework 来集中管理和使用通知功能,还增加一些实用的功能——撤回单条通知、更新已展示通知、中途修改通知内容、在通知中显示多媒体资源、自定义UI等功能,功能着实强大!

本文主要是针对iOS 10的消息通知做介绍,所以很多代码没有对iOS 10之前做添加适配。

基本原理

iOS推送分为Local Notifications(本地推送) 和 Remote Notifications(远程推送)(原理图来源于网络,如有侵权请告知,我会添加来源,我怕我赔不起)

Local Notifications(本地推送)

iOS 10 消息推送(UserNotifications)秘籍总结 Local Notifications.png

App本地创建通知,加入到系统的Schedule里, 如果触发器条件达成时会推送相应的消息内容 Remote Notifications(远程推送)

iOS 10 消息推送(UserNotifications)秘籍总结 Remote Notifications1.jpg

图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用我花了12块大洋(心疼)买的 APNS Pusher 作为我的推送源。

APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器。

上图可以分为三个阶段:

第一阶段:APNS Pusher应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。

第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone。

第三阶段:iPhone把发来的消息传递给相应的应用程序, 并且按照设定弹出Push通知。

iOS 10 消息推送(UserNotifications)秘籍总结 Remote Notifications2.jpeg

从上图我们可以看到:

首先是应用程序注册消息推送。 IOS跟APNS Server要deviceToken。应用程序接受deviceToken。 应用程序将deviceToken发送给PUSH服务端程序。 服务端程序向APNS服务发送消息。 APNS服务将消息发送给iPhone应用程序。 基本配置和基本方法

如果只是简单的本地推送,跳过1 2 步骤,直接到3

1、 如果你的App有远端推送的话,那你需要开发者账号的,需要新建一个对应你bundle的push 证书。证书这一块我就不说了,如果针对证书有什么问题可以给我留言,我会单独把证书相关的知识点整理起来!如果你没有账号,可以到某宝买个,很便宜。

2、 Capabilities中打开Push Notifications 开关

在XCode7中这里的开关不打开,推送也是可以正常使用的,但是在XCode8中,这里的开关必须要打开,不然会报错:

Error Domain=NSCocoaErrorDomain Code=3000 "未找到应用程序的“aps-environment”的授权字符串" UserInfo={NSLocalizedDescription=未找到应用程序的“aps-environment”的授权字符串} 打开后会自动在项目里生成entitlements文件。

iOS 10 消息推送(UserNotifications)秘籍总结 Push Notification开关.png

iOS 10 消息推送(UserNotifications)秘籍总结 entitlements文件.png

3、 推送的注册

第一步: 导入 #import <UserNotifications/UserNotifications.h>

且要遵守的协议,在Appdelegate.m中。

这里需要注意,我们最好写成这种形式(防止低版本找不到头文件出现问题)

#ifdef NSFoundationVersionNumber_iOS_9_x_Max #import <UserNotifications/UserNotifications.h> #endif 第二步:我们需要在

  • (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions中注册通知,代码如下

  • (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [self replyPushNotificationAuthorization:application]; return YES; } #pragma mark - 申请通知权限 // 申请通知权限

  • (void)replyPushNotificationAuthorization:(UIApplication *)application{

if (IOS10_OR_LATER) { //iOS 10 later UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; //必须写代理,不然无法监听通知的接收与点击事件 center.delegate = self; [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) { if (!error && granted) { //用户点击允许 NSLog(@"注册成功"); }else{ //用户点击不允许 NSLog(@"注册失败"); } }];

// 可以通过 getNotificationSettingsWithCompletionHandler 获取权限设置 //之前注册推送服务,用户点击了同意还是不同意,以及用户之后又做了怎样的更改我们都无从得知,现在 apple 开放了这个 API,我们可以直接获取到用户的设定信息了。注意UNNotificationSettings是只读对象哦,不能直接修改! [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) { NSLog(@"========%@",settings); }]; }else if (IOS8_OR_LATER){ //iOS 8 - iOS 10系统 UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil]; [application registerUserNotificationSettings:settings]; }else{ //iOS 8.0系统以下 [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound]; }

//注册远端消息通知获取device token [application registerForRemoteNotifications]; } 上面需要注意:

  1. 必须写代理,不然无法监听通知的接收与点击事件 center.delegate = self; 下面是我在项目里定义的宏 #define IOS10_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10.0) #define IOS9_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9.0) #define IOS8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) #define IOS7_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
  2. 之前注册推送服务,用户点击了同意还是不同意,以及用户之后又做了怎样的更改我们都无从得知,现在 apple 开放了这个 API,我们可以直接获取到用户的设定信息了。注意UNNotificationSettings是只读对象哦,不能直接修改!只能通过以下方式获取 [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) { NSLog(@"========%@",settings); }]; 打印信息如下: ========<UNNotificationSettings: 0x1740887f0; authorizationStatus: Authorized, notificationCenterSetting: Enabled, soundSetting: Enabled, badgeSetting: Enabled, lockScreenSetting: Enabled, alertSetting: NotSupported, carPlaySetting: Enabled, alertStyle: Banner> 4、 远端推送需要获取设备的Device Token的方法是没有变的,代码如下

#pragma mark - 获取device Token //获取DeviceToken成功

  • (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{

//解析NSData获取字符串 //我看网上这部分直接使用下面方法转换为string,你会得到一个nil(别怪我不告诉你哦) //错误写法 //NSString *string = [[NSString alloc] initWithData:deviceToken encoding:NSUTF8StringEncoding];

//正确写法 NSString *deviceString = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]]; deviceString = [deviceString stringByReplacingOccurrencesOfString:@" " withString:@""];

NSLog(@"deviceToken===========%@",deviceString); } //获取DeviceToken失败

  • (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{ NSLog(@"[DeviceToken Error]:%@ ",error.description); } 5、这一步吊了,这是iOS 10系统更新时,苹果给了我们2个代理方法来处理通知的接收和点击事件,这两个方法在的协议中,大家可以查看下。

@protocol UNUserNotificationCenterDelegate

@optional

// The method will be called on the delegate only if the application is in the foreground. If the method is not implemented or the handler is not called in a timely manner then the notification will not be presented. The application can choose to have the notification presented as a sound, badge, alert and/or in the notification list. This decision should be based on whether the information in the notification is otherwise visible to the user.

  • (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler __IOS_AVAILABLE(10.0) __TVOS_AVAILABLE(10.0) __WATCHOS_AVAILABLE(3.0);

// The method will be called on the delegate when the user responded to the notification by opening the application, dismissing the notification or choosing a UNNotificationAction. The delegate must be set before the application returns from applicationDidFinishLaunching:.

  • (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler __IOS_AVAILABLE(10.0) __WATCHOS_AVAILABLE(3.0) __TVOS_PROHIBITED;

@end

此外,苹果把本地通知跟远程通知合二为一。区分本地通知跟远程通知的类是UNPushNotificationTrigger.h类中,UNPushNotificationTrigger的类型是新增加的,通过它,我们可以得到一些通知的触发条件 ,解释如下:

UNPushNotificationTrigger (远程通知) 远程推送的通知类型 UNTimeIntervalNotificationTrigger (本地通知) 一定时间之后,重复或者不重复推送通知。我们可以设置timeInterval(时间间隔)和repeats(是否重复)。 UNCalendarNotificationTrigger(本地通知) 一定日期之后,重复或者不重复推送通知 例如,你每天8点推送一个通知,只要dateComponents为8,如果你想每天8点都推送这个通知,只要repeats为YES就可以了。 UNLocationNotificationTrigger (本地通知)地理位置的一种通知, 当用户进入或离开一个地理区域来通知。 现在先提出来,后面我会一一代码演示出每种用法。还是回到两个很吊的代理方法吧 #pragma mark - iOS10 收到通知(本地和远端) UNUserNotificationCenterDelegate //App处于前台接收通知时

  • (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler{

//收到推送的请求 UNNotificationRequest *request = notification.request;

//收到推送的内容 UNNotificationContent *content = request.content;

//收到用户的基本信息 NSDictionary *userInfo = content.userInfo;

//收到推送消息的角标 NSNumber *badge = content.badge;

//收到推送消息body NSString *body = content.body;

//推送消息的声音 UNNotificationSound *sound = content.sound;

// 推送消息的副标题 NSString *subtitle = content.subtitle;

// 推送消息的标题 NSString *title = content.title;

if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) { //此处省略一万行需求代码。。。。。。 NSLog(@"iOS10 收到远程通知:%@",userInfo);

}else { // 判断为本地通知 //此处省略一万行需求代码。。。。。。 NSLog(@"iOS10 收到本地通知:{\nbody:%@,\ntitle:%@,\nsubtitle:%@,\nbadge:%@,\nsound:%@,\nuserInfo:%@\n}",body,title,subtitle,badge,sound,userInfo); }

// 需要执行这个方法,选择是否提醒用户,有Badge、Sound、Alert三种类型可以设置 completionHandler(UNNotificationPresentationOptionBadge| UNNotificationPresentationOptionSound| UNNotificationPresentationOptionAlert);

}

//App通知的点击事件

  • (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{ //收到推送的请求 UNNotificationRequest *request = response.notification.request;

//收到推送的内容 UNNotificationContent *content = request.content;

//收到用户的基本信息 NSDictionary *userInfo = content.userInfo;

//收到推送消息的角标 NSNumber *badge = content.badge;

//收到推送消息body NSString *body = content.body;

//推送消息的声音 UNNotificationSound *sound = content.sound;

// 推送消息的副标题 NSString *subtitle = content.subtitle;

// 推送消息的标题 NSString *title = content.title;

if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) { NSLog(@"iOS10 收到远程通知:%@",userInfo); //此处省略一万行需求代码。。。。。。

}else { // 判断为本地通知 //此处省略一万行需求代码。。。。。。 NSLog(@"iOS10 收到本地通知:{\nbody:%@,\ntitle:%@,\nsubtitle:%@,\nbadge:%@,\nsound:%@,\nuserInfo:%@\n}",body,title,subtitle,badge,sound,userInfo); } //2016-09-27 14:42:16.353978 UserNotificationsDemo[1765:800117] Warning: UNUserNotificationCenter delegate received call to -userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler: but the completion handler was never called. completionHandler(); // 系统要求执行这个方法 } 需要注意的:

1.下面这个代理方法,只会是app处于前台状态 前台状态 and 前台状态下才会走,后台模式下是不会走这里的

  • (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler 2.下面这个代理方法,只会是用户点击消息才会触发,如果使用户长按(3DTouch)、弹出Action页面等并不会触发。点击Action的时候会触发!
  • (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler 3.点击代理最后需要执行:completionHandler(); // 系统要求执行这个方法 不然会报: 2016-09-27 14:42:16.353978 UserNotificationsDemo[1765:800117] Warning: UNUserNotificationCenter delegate received call to -userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler: but the completion handler was never called. 4.不管前台后台状态下。推送消息的横幅都可以展示出来!后台状态不用说,前台时需要在前台代理方法中设置 ,设置如下: // 需要执行这个方法,选择是否提醒用户,有Badge、Sound、Alert三种类型可以设置 completionHandler(UNNotificationPresentationOptionBadge| UNNotificationPresentationOptionSound| UNNotificationPresentationOptionAlert); 6、 iOS 10之前接收通知的兼容方法

#pragma mark -iOS 10之前收到通知

  • (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { NSLog(@"iOS6及以下系统,收到通知:%@", userInfo); //此处省略一万行需求代码。。。。。。 }
  • (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { NSLog(@"iOS7及以上系统,收到通知:%@", userInfo); completionHandler(UIBackgroundFetchResultNewData); //此处省略一万行需求代码。。。。。。 } 段结:是不是以为就结束了?NO NO NO(你以为离开了幻境,其实才刚刚踏入幻境!)上面的介绍了基本原理、基本配置以及基本方法说明,现在做完这些工作,我们的学习才刚刚开始!现在天时、地利、人和、可以开始下面推送coding的学习和测试了。

在用户日常生活中会有很多种情形需要通知,比如:新闻提醒、定时吃药、定期体检、到达某个地方提醒用户等等,这些功能在 UserNotifications 中都提供了相应的接口。

iOS 10 消息推送(UserNotifications)秘籍总结 图片来源于网络.jpeg

我们先学会基本的技能简单的推送(爬),后面在学习进阶定制推送(走),最后看看能不能高级推送(飞不飞起来看个人了,我是飞不起来):

基本Local Notifications(本地推送) 和 Remote Notifications(远程推送)

一、 基本的本地推送

本地推送生成主要流程就是:

  1. 创建一个触发器(trigger)
  2. 创建推送的内容(UNMutableNotificationContent)
  3. 创建推送请求(UNNotificationRequest)
  4. 推送请求添加到推送管理中心(UNUserNotificationCenter)中 1、新功能trigger可以在特定条件触发,有三类:UNTimeIntervalNotificationTrigger、UNCalendarNotificationTrigger、UNLocationNotificationTrigger

1.1、 UNTimeIntervalNotificationTrigger:一段时间后触发(定时推送)

//timeInterval:单位为秒(s) repeats:是否循环提醒 //50s后提醒 UNTimeIntervalNotificationTrigger *trigger1 = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:50 repeats:NO]; 1.2 UNCalendarNotificationTrigger :调用

  • (instancetype)triggerWithDateMatchingComponents:(NSDateComponents *)dateComponents repeats:(BOOL)repeats;进行注册;时间点信息用 NSDateComponents.(定期推送)

//在每周一的14点3分提醒 NSDateComponents *components = [[NSDateComponents alloc] init]; components.weekday = 2; components.hour = 16; components.minute = 3; // components 日期 UNCalendarNotificationTrigger *calendarTrigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:components repeats:YES]; 1.3、UNLocationNotificationTrigger:调用

  • (instancetype)triggerWithRegion:(CLRegion *)region repeats:(BOOL)repeats;

进行注册,地区信息使用CLRegion的子类CLCircularRegion,可以配置region属性 notifyOnEntry和notifyOnExit,是在进入地区、从地区出来或者两者都要的时候进行通知,这个测试过程专门从公司跑到家时刻关注手机有推送嘛,果然是有的(定点推送)

//首先得导入#import <CoreLocation/CoreLocation.h>,不然会regin创建有问题。 // 创建位置信息 CLLocationCoordinate2D center1 = CLLocationCoordinate2DMake(39.788857, 116.5559392); CLCircularRegion *region = [[CLCircularRegion alloc] initWithCenter:center1 radius:500 identifier:@"经海五路"]; region.notifyOnEntry = YES; region.notifyOnExit = YES; // region 位置信息 repeats 是否重复 (CLRegion 可以是地理位置信息) UNLocationNotificationTrigger *locationTrigger = [UNLocationNotificationTrigger triggerWithRegion:region repeats:YES]; 2、创建推送的内容(UNMutableNotificationContent)

UNNotificationContent:属性readOnly

UNMutableNotificationContent:属性有title、subtitle、body、badge、sound、lauchImageName、userInfo、attachments、categoryIdentifier、threadIdentifier

本地消息内容 |内容限制大小 |展示

-------------|--------|

title |NSString| 限制在一行,多出部分省略号

subtitle |NSString |限制在一行,多出部分省略号

body| NSString |通知栏出现时,限制在两行,多出部分省略号;预览时,全部展示

**注意点: **body中printf风格的转义字符,比如说要包含%,需要写成%% 才会显示,同样

// 创建通知内容 UNMutableNotificationContent, 注意不是 UNNotificationContent ,此对象为不可变对象。

UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];

content.title = @"Dely 时间提醒 - title";

content.subtitle = [NSString stringWithFormat:@"Dely 装逼大会竞选时间提醒 - subtitle"];

content.body = @"Dely 装逼大会总决赛时间到,欢迎你参加总决赛!希望你一统X界 - body";

content.badge = @666;

content.sound = [UNNotificationSound defaultSound];

content.userInfo = @{@"key1":@"value1",@"key2":@"value2"};

3、创建完整的本地推送请求Demo

//定时推送

  • (void)createLocalizedUserNotification{

// 设置触发条件 UNNotificationTrigger UNTimeIntervalNotificationTrigger *timeTrigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:5.0f repeats:NO];

// 创建通知内容 UNMutableNotificationContent, 注意不是 UNNotificationContent ,此对象为不可变对象。 UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init]; content.title = @"Dely 时间提醒 - title"; content.subtitle = [NSString stringWithFormat:@"Dely 装逼大会竞选时间提醒 - subtitle"]; content.body = @"Dely 装逼大会总决赛时间到,欢迎你参加总决赛!希望你一统X界 - body"; content.badge = @666; content.sound = [UNNotificationSound defaultSound]; content.userInfo = @{@"key1":@"value1",@"key2":@"value2"};

// 创建通知标示 NSString *requestIdentifier = @"Dely.X.time";

// 创建通知请求 UNNotificationRequest 将触发条件和通知内容添加到请求中 UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:requestIdentifier content:content trigger:timeTrigger];

UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter]; // 将通知请求 add 到 UNUserNotificationCenter [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) { if (!error) { NSLog(@"推送已添加成功 %@", requestIdentifier); //你自己的需求例如下面: UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"本地通知" message:@"成功添加推送" preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]; [alert addAction:cancelAction]; [[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:alert animated:YES completion:nil]; //此处省略一万行需求。。。。 } }]; } 运行结果如下:

iOS 10 消息推送(UserNotifications)秘籍总结 装X决赛通知.jpg

二、 基本的远端推送

如果你想模拟远端推送,按照我前面介绍的配置基本环境、证书、push开关和基本方法就可以模拟远端的基本远端推送。

1、运行工程则会拿到设备的Device Token,后面会用到。

iOS 10 消息推送(UserNotifications)秘籍总结 device token.png

2、现在我们需要一个推送服务器给APNS发送信息。我前面说了我花了12块大洋(心疼死我了)买了一个APNS pusher 来模拟远端推送服务,当然你可以不花钱也可以用到,例如:

NWPusher

iOS 10 消息推送(UserNotifications)秘籍总结 APNS pusher

3、你需要把你刚刚获取的device token填到相应位置,同时你要配置好push证书哦。

4、需要添加aps内容了,然后点击send就OK了

{ "aps" : { "alert" : { "title" : "iOS远程消息,我是主标题!-title", "subtitle" : "iOS远程消息,我是主标题!-Subtitle", "body" : "Dely,why am i so handsome -body" }, "badge" : "2" } } 5、稍纵即逝你就收到了远端消息了

iOS 10 消息推送(UserNotifications)秘籍总结 远端消息.jpg

6、Notification Management

对推送进行查、改、删。都需要一个必需的参数requestIdentifier

1、更新通知

Local Notification需要通过更新request.相同的requestIdentifier,重新添加到推送center就可以了,说白了就是重新创建local Notification request(只要保证requestIdentifier就ok了),应用场景如图

iOS 10 消息推送(UserNotifications)秘籍总结 iOS 10 消息推送(UserNotifications)秘籍总结 Local Notification更新后.png

Remote Notification 更新需要通过新的字段apps-collapse-id来作为唯一标示,我前面用的APNS pusher暂不支持这个字段,不过github上有很多这样的工具:

github.com/KnuffApp/Kn…

这样remote 也可以更新推送消息

2、推送消息的查找和删除

// Notification requests that are waiting for their trigger to fire //获取未送达的所有消息列表

  • (void)getPendingNotificationRequestsWithCompletionHandler:(void(^)(NSArray<UNNotificationRequest *> *requests))completionHandler; //删除所有未送达的特定id的消息
  • (void)removePendingNotificationRequestsWithIdentifiers:(NSArray<NSString *> *)identifiers; //删除所有未送达的消息
  • (void)removeAllPendingNotificationRequests; // Notifications that have been delivered and remain in Notification Center. Notifiations triggered by location cannot be retrieved, but can be removed. //获取已送达的所有消息列表
  • (void)getDeliveredNotificationsWithCompletionHandler:(void(^)(NSArray<UNNotification *> *notifications))completionHandler __TVOS_PROHIBITED; //删除所有已送达的特定id的消息
  • (void)removeDeliveredNotificationsWithIdentifiers:(NSArray<NSString *> *)identifiers __TVOS_PROHIBITED; //删除所有已送达的消息
  • (void)removeAllDeliveredNotifications __TVOS_PROHIBITED; 测试如下:
  • (void)notificationAction{ NSString requestIdentifier = @"Dely.X.time"; UNUserNotificationCenter center = [UNUserNotificationCenter currentNotificationCenter];

//删除设备已收到的所有消息推送 // [center removeAllDeliveredNotifications];

//删除设备已收到特定id的所有消息推送 // [center removeDeliveredNotificationsWithIdentifiers:@[requestIdentifier]];

//获取设备已收到的消息推送 [center getDeliveredNotificationsWithCompletionHandler:^(NSArray<UNNotification *> * _Nonnull notifications) { }]; } 段结: 收到通知时你需要在appdelegate里面的代理方法里处理你的需求逻辑,这个需要你自己写了。到目前为止你掌握了基本的本地推送和基本的远端推送!

不知不觉写了这么多字(全是TM废话)、本来继续打算写进阶的本地和远端推送(Media Attachments、Notification Actions、自定义推送界面等),留着下一篇博客继续分享吧,欲知后事如何,且听下会装X!

欢迎加java交流QQ群:668041364 交流经验

转载于:https://juejin.im/post/5d09ebfb6fb9a07ea42081cf

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: iOS消息推送 APNs 是指苹果公司提供的一种用于向移动设备发送远程通知的服务。而使用 Java 实现 HTTP/2 协议发送推送消息可以通过以下步骤完成。 首先,我们需要使用 Java 开发一个 HTTP/2 客户端,以实现与 APNs 服务器的通信。我们可以使用 okhttp、netty 或者 java-http-client 等库来实现这个客户端。 其次,我们需要获取 APNs 服务器的推送地址和凭证认证信息。推送地址常见的有两个,分别是开发环境和生产环境。在获取推送地址之后,我们还需要生成一个包含认证信息的 JWT(JSON Web Tokens),以进行身份验证。 然后,我们可以使用 Java 客户端向 APNs 服务器发送 HTTP/2 请求。请求的内容应包括推送通知的 payload 和设备的设备标识符(Device Token)等信息。设备标识符是由 APNs 服务器为每个设备生成的唯一标识符,用于指定接收消息的设备。 最后,我们可以根据 APNs 服务器的响应来判断推送是否成功。APNs 服务器会返回一个包含推送结果的响应,其中包括推送是否成功以及失败的原因。 总之,使用 Java 实现 HTTP/2 协议发送 iOS 消息推送 APNs,需要开发一个符合 HTTP/2 协议的客户端,生成凭证信息并发送请求。通过与 APNs 服务器的通信,可以将推送消息发送到指定的 iOS 设备上。 ### 回答2: iOS消息推送(APNs)是苹果公司提供的一种服务,用于将推送通知发送到iOS设备上的应用程序。实现APNs推送的一种方法是使用HTTP/2协议发送请求。 在Java中,可以使用一些第三方库来实现使用HTTP/2协议发送APNs消息推送。其中,使用Netty库是一个常见的选择。 首先,你需要引入Netty库的相关依赖项,并创建一个Netty的客户端连接。 然后,你需要创建APNs推送的请求和消息内容。APNs消息使用JSON格式进行发送,你需要构建一个JSON对象来包含推送的内容。这个内容可以包括通知标题、内容、图标等。 接下来,你需要将JSON对象编码为二进制数据,并发送给APNs服务器。此时,你可以使用Netty库提供的HTTP/2的客户端请求来发送。 发送请求的过程包括建立连接、发送帧、处理响应等步骤。你需要设置请求的方法、URL、Headers以及Payload(即消息内容的二进制数据)。 最后,你需要在接收到APNs服务器的响应后,进行对应的处理和错误处理。常见的响应包括成功响应和错误响应。 总结起来,实现使用HTTP/2协议发送APNs消息推送的过程,包括建立连接、构建JSON消息、编码为二进制数据、发送请求、处理响应等步骤。通过使用Netty库,可以简化这个实现过程,并提供了更好的性能和可扩展性。 ### 回答3: 在iOS中,APNS(Apple Push Notification Service)是一种用于向苹果设备(如iPhone、iPad、iPod Touch等)推送消息的服务。而在Java中,可以使用HTTP/2协议来实现发送APNS通知。 HTTP/2是一种基于HTTP/1.1的进化版本,其在性能和效率上有所提升。使用Java实现HTTP/2协议发送APNS通知的步骤如下: 1. 首先,需要准备APNS证书。在苹果开发者账号中创建一个推送证书,并将其导出为.p12文件。 2. 将.p12文件转换为Java可用的密钥和证书形式。可以使用Java的KeyTool工具来完成此步骤。 3. 使用Java的HTTP/2库,如Jetty或Netty,建立与APNS服务器的HTTP/2连接。这些库可提供与APNS服务器之间的双向通信。 4. 在建立连接后,可以使用HTTP/2的帧和流的概念向APNS服务器发送推送通知。可以使用Jetty或Netty提供的API来创建和发送HTTP/2帧。 5. 在发送通知时,需要将推送的相关信息,如设备令牌、推送内容等,封装为HTTP/2的帧数据发送到APNS服务器。 6. APNS服务器收到推送请求后,会根据设备令牌等信息将通知推送给相应的设备。 总之,使用Java实现HTTP/2协议发送APNS通知需要准备证书、使用HTTP/2库建立连接,并利用API创建和发送HTTP/2帧,最后将推送信息发送给APNS服务器。这样就可以通过HTTP/2协议向iOS设备推送消息了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值