一、iOS推送通知简介
众所周知苹果的推送通知从iOS3开始出现, 每一年都会更新一些新的用法. 譬如iOS7出现的Silent remote notifications(远程静默推送), iOS8出现的Category(分类, 也可称之为快捷回复), iOS9出现的Text Input action(文本框快捷回复).
而在iOS10, 苹果可谓是大刀阔斧般的, 对远程通知和本地通知进行了大范围的更新. iOS10推出了全新的UserNotifications框架(iOS10之前从属于UIKit框架).
新的推送通知框架, 整合了本地推送和远程推送的点击处理方法, 使得以前专门处理推送点击的方法只能处理静默推送了.
二、远程推送通知介绍
1、什么是远程推送
在联网的情况下,由远程服务器推送给客户端的通知,又称APNs(Apple Push Notification Services)不管应用是打开还是关闭的情况下,都能接收到服务器推送的远程通知在联网状态下,所有苹果设备都会与苹果服务器建立长连接
2、远程推送的实现原理:
1.打开App时: 发送UDID
和BundleID
给APNs
加密后返回deviceToken
2.获取Token
后,App调用接口,将用户身份信息和deviceToken
发给服务器,服务器记录
3.当推送消息时, 服务器按照用户身份信息找到存储的deviceToken
,将消息和deviToken
发送给APNs
4.苹果的APNs通过deviceToken
, 找到指定设备的指定程序, 并将消息推送给用户
3、实现远程推送功能的前提
1.真机
2.调试阶段的证书
iOS_development.cer
用于真机调试的证书
aps_development.cer
用于真机推送调试能的证书
xxx.mobileprovision
描述文件,记录了能够调试的手机、电脑和程序
3.发布阶段的证书
iOS_distribution.cer
用于发布app的证书
aps.cer
用于发布时,让app有推送功能的证书
xxx.mobileprovision
描述文件,记录了能够发布app的电脑
如何配置证书, 不在本教程内, 请读者自行处理, 或者参考视频教程
三、iOS10 全新远程通知教程
一、 注册远程推送并获取DeviceToken
1.创建iOS的项目,并输入项目名字
2.在AppDelegate
中导入头文件:
1
|
#import <UserNotifications/UserNotifications.h> |
3.在application:didFinishLaunchingWithOptions
方法中, 注册远程通知
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
- ( BOOL )application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //请求通知权限, 本地和远程共用 UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; [center requestAuthorizationWithOptions:UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert completionHandler:^( BOOL granted, NSError * _Nullable error) { if (granted) { NSLog(@ "请求成功" ); } else { NSLog(@ "请求失败" ); } }]; //注册远程通知 [[UIApplication sharedApplication] registerForRemoteNotifications]; //设置通知的代理 center.delegate = self; return YES; } |
4.在接收远程推送的DeviceToken
方法中, 获取Token
1
2
3
4
5
|
- ( void )application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { //将来需要将此Token上传给后台服务器 NSLog(@ "token:%@" , deviceToken); } |
二、 iOS10远程推送通知的处理方法
当点击了推送后, 如果你希望进行处理. 那么在iOS10中, 还需要设置UNUserNotificationCenter
的delegate
, 并遵守UNUserNotificationCenterDelegate
协议.
以及实现下面实现3个方法, 用于处理点击通知时的不同情况的处理
willPresentNotification:withCompletionHandler
用于前台运行
didReceiveNotificationResponse:withCompletionHandler
用于后台及程序退出
didReceiveRemoteNotification:fetchCompletionHandler
用于静默推送
1
2
|
//设置通知的代理 center.delegate = self; |
1.前台运行 会调用的方法
前台运行: 指的是程序正在运行中, 用户能看见程序的界面.
iOS10会出现通知横幅, 而在以前的框架中, 前台运行时, 不会出现通知的横幅.
1
2
3
4
5
6
7
8
9
10
|
- ( void )userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:( void (^)(UNNotificationPresentationOptions))completionHandler { NSDictionary *userInfo = notification.request.content.userInfo; //前台运行推送 显示红色Label [self showLabelWithUserInfo:userInfo color:[UIColor redColor]]; //可以设置当收到通知后, 有哪些效果呈现(声音/提醒/数字角标) completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert); } |
2.后台运行及程序退出 会调用的方法
后台运行: 指的是程序已经打开, 用户看不见程序的界面, 如锁屏和按Home键.
程序退出: 指的是程序没有运行, 或者通过双击Home键,关闭了程序.
1
2
3
4
5
6
7
8
9
|
- ( void )userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:( void (^)())completionHandler { NSDictionary *userInfo = response.notification.request.content.userInfo; //后台及退出推送 显示绿色Label [self showLabelWithUserInfo:userInfo color:[UIColor greenColor]]; completionHandler(); } |
3.静默推送通知 会调用的方法
静默推送: iOS7以后出现, 不会出现提醒及声音.
要求:
推送的payload
中不能包含alert
及sound
字段
需要添加content-available
字段, 并设置值为1
例如: {"aps":{"content-available":"1"},"PageKey”":"2"}
1
2
3
4
5
6
7
8
|
//如果是以前的旧框架, 此方法 前台/后台/退出/静默推送都可以处理 - ( void )application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:( void (^)(UIBackgroundFetchResult))completionHandler { //静默推送 显示蓝色Label [self showLabelWithUserInfo:userInfo color:[UIColor blueColor]]; completionHandler(UIBackgroundFetchResultNewData); } |
4.处理通知的公用方法
开发中, 点击通知的逻辑应当看自己程序的需求.
这里为了方便演示, 简单的将通知的值, 通过UILabel
显示在主界面上.
1
2
3
4
5
6
7
8
9
|
- ( void )showLabelWithUserInfo:(NSDictionary *)userInfo color:(UIColor *)color { UILabel *label = [UILabel new ]; label.backgroundColor = color; label.frame = CGRectMake(0, 250, [UIScreen mainScreen].bounds.size.width, 300); label.text = userInfo.description; label.numberOfLines = 0; [[UIApplication sharedApplication].keyWindow addSubview:label]; } |
三、测试远程推送
PushMeBaby
是一个简单的模拟服务器的Mac小程序, 可以将内容提交给苹果的APNs服务器.
为了测试远程通知, 我们需要安装此程序.
请前往www.github.com, 搜索并下载PushMeBaby
使用时:
编译该项目, 如果报错, 则注释报错的代码, 不影响实际使用.
进入苹果开发者网站, 获取真机调试用的远程推送证书, 导入到项目中
将之前获取到的DeviceToken
, 及测试的文字, 填入该项目中的AppDelegate
中的init
方法中.
运行此项目, 会出现一个Mac小程序, 点击Push即可发送远程通知.
1
2
3
4
5
6
7
8
9
|
- (id)init { self = [super init]; if (self != nil) { self.deviceToken = @ "de20184c ef0461d5 12c76422 f5b78240 5f657e18 ebf91c9f 01d5560c e2913102" ; self.payload = @ "{\\" aps\\ ":{\\" alert\\ ":{\\" title\\ ":\\" himeao\\ ",\\" subtitle\\ ":\\" 自学成才\\ ",\\" body\\ ":\\" iOS10远程&本地推送教程\\ "},\\" badge\\ ":1,\\" sound\\ ":\\" default \\ "},\\" PageKey\\ ":\\" 1\\ "}" ; self.certificate = [[NSBundle mainBundle] pathForResource:@ "aps_development" ofType:@ "cer" ]; } return self; } |
总结
以上就是iOS10最新实现远程通知开发教程的全部内容,这篇文章的内容对大家学习iOS10还是很有参考借鉴价值的,希望能对各位iOS开发者们有所帮助,如果大家有疑问可以留言交流。