iOS---iOS10适配iOS当前所有系统的远程推送
一、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的电脑
如何配置证书,请参考我的另一博文: iOS-推送,证书申请,本地推送
二、 iOS10远程推送通知的处理方法
当点击了推送后, 如果你希望进行处理. 那么在iOS10中, 还需要设置UNUserNotificationCenter的delegate, 并遵守UNUserNotificationCenterDelegate协议.
以及实现下面实现3个方法, 用于处理点击通知时的不同情况的处理
willPresentNotification:withCompletionHandler 用于前台运行
didReceiveNotificationResponse:withCompletionHandler 用于后台及程序退出
didReceiveRemoteNotification:fetchCompletionHandler用于静默推送
1.前台运行 会调用的方法
前台运行: 指的是程序正在运行中, 用户能看见程序的界面.
iOS10会出现通知横幅, 而在以前的框架中, 前台运行时, 不会出现通知的横幅.
代码开始前的设置
iOS 10 的推送 与原来的都不一样,他把本地的推送 跟 远程的推送结合到一起了,UserNotifications.framework 库。在使用推送的时候,先开启通知的开关。
就是上面这个。当你开启后,xcode 会自动帮你在 项目里面创建一个文件,xxxx.entitlements.
这个文件是系统帮你创建的,不用管它。
在appDeletgate 文件里面需要先导入 UNUserNotificationCenterDelegate 这个代理。他的代理方法分别是
- - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler __IOS_AVAILABLE(10.0) __TVOS_AVAILABLE(10.0) __WATCHOS_AVAILABLE(3.0);
- - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler __IOS_AVAILABLE(10.0)
代码如下:
2
3 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
4
5
6
7 /**
8
9 注册远程推送和本地通知,适配至最新系统,目前是 iOS10
10
11 */
12
13 [self registerRemoteNotificationsForAlliOSSystemVersion];
14
15
16
17
18
19 // Override point for customization after application launch.
20
21 return YES;
22
23 }
24
25
26
27 /**
28
29 注册远程推送和本地通知,适配至最新系统,目前是 iOS10
30
31 */
32
33 -(void)registerRemoteNotificationsForAlliOSSystemVersion{
34
35
36
37 //
38
39
40
41
42
43 //导入文件 #import <UserNotifications/UserNotifications.h>
44
45 //去capabilities(功能)设置这边打开 pushNotifications,并且打开 backgroundModes 中的backgroundFentch,Remote Notifications
46
47 CGFloat version = [[[UIDevice currentDevice] systemVersion] floatValue];
48
49 if (version >= 10.0) {//10.0及其以上
50
51 UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
52
53 //请求通知权限, 本地和远程共用
54
55 // 设定通知可选提示类型
56
57 [center requestAuthorizationWithOptions:UNAuthorizationOptionCarPlay | UNAuthorizationOptionSound | UNAuthorizationOptionBadge | UNAuthorizationOptionAlert completionHandler:^(BOOL granted, NSError * _Nullable error) {
58
59 if (error) {
60
61 NSLog(@"iOS10请求 接受远程和本地通知 授权失败:<%@>",[error description]);
62
63 }
64
65
66
67 if (granted) {
68
69 NSLog(@" iOS 10 request notification success");
70
71 NSLog(@"请求成功");
72
73 }else{
74
75 NSLog(@" iOS 10 request notification fail");
76
77 NSLog(@"请求失败");
78
79 }
80
81 }];
82
83
84
85 //设置通知的代理
86
87 center.delegate = self;//1.遵守UNUserNotificationCenterDelegate协议,2.成为代理;3.实现代理回调方法
88
89 }else if (version>=8.0){//8.0--->10.0
90
91 //请求用户授权 授权收到推送时有哪些提醒方式可以选
92
93 // 声音、角标、弹窗
94
95 UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeSound | UIUserNotificationTypeBadge | UIUserNotificationTypeAlert categories:nil];
96
97 [[UIApplication sharedApplication] registerUserNotificationSettings:setting];
98
99 }else{//8.0以下
100
101 UIRemoteNotificationType type = UIRemoteNotificationTypeSound| UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge;
102
103 [[UIApplication sharedApplication] registerForRemoteNotificationTypes:type];
104
105 }
106
107
108
109 //注册通知
110
111 [[UIApplication sharedApplication] registerForRemoteNotifications];
112
113
114
115
116
117
118
119 }
120
121 #pragma mark-推送通知
122
123 //注册成功
124
125 -(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
126
127
128
129 NSString *token = [deviceToken description]; //获取
130
131
132
133 token = [token stringByReplacingOccurrencesOfString:@" " withString:@""];
134
135 token = [token stringByReplacingOccurrencesOfString:@"<" withString:@""];
136
137 token = [token stringByReplacingOccurrencesOfString:@">" withString:@""];
138
139
140
141 NSLog(@"request notificatoin token success. %@",token);
142
143
144
145
146
147
148
149 }
150
151 //注册失败
152
153 - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
154
155 {
156
157 NSLog(@"request notification Token fail. %@",error.localizedDescription);
158
159 }
160
161
162
163 #pragma mark iOS 10 获取推送信息 UNUserNotificationCenter---Delegate
164
165
166
167 //APP在前台的时候收到推送的回调
168
169 - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler
170
171 {
172
173
174
175
176
177 UNNotificationContent *content = notification.request.content;
178
179 NSDictionary *userInfo = content.userInfo;
180
181
182
183 [self handleRemoteNotificationContent:userInfo];
184
185
186
187 //前台运行推送 显示红色Label
188
189 [self showLabelWithUserInfo:userInfo color:[UIColor redColor]];
190
191
192
193
194
195 //可以设置当收到通知后, 有哪些效果呈现(提醒/声音/数字角标)
196
197 //可以执行设置 弹窗提醒 和 声音
198
199 completionHandler(UNNotificationPresentationOptionAlert | UNNotificationPresentationOptionSound|UNNotificationPresentationOptionBadge);
200
201 }
202
203 //APP在后台,点击推送信息,进入APP后执行的回调
204
205 - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler
206
207 {
208
209
210
211
212
213 UNNotificationContent *content = response.notification.request.content;
214
215 NSDictionary *userInfo = content.userInfo;
216
217
218
219 [self handleRemoteNotificationContent:userInfo];
220
221 //后台及退出推送 显示绿色Label
222
223 [self showLabelWithUserInfo:userInfo color:[UIColor greenColor]];
224
225
226
227 completionHandler();
228
229 }
230
231
232
233 - (void)handleRemoteNotificationContent:(NSDictionary *)userInfo
234
235 {
236
237 NSLog(@" iOS 10 after Notificatoin message:\n %@",userInfo);
238
239 }
240
241 #pragma mark iOS 10 之前 获取通知的信息
242
243 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
244
245
246
247 //静默推送 显示蓝色Label
248
249 [self showLabelWithUserInfo:userInfo color:[UIColor blueColor]];
250
251
252
253 completionHandler(UIBackgroundFetchResultNewData);
254
255 }
256
257 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
258
259 {
260
261 NSLog(@"iOS 10 before Notification message。\n %@",userInfo);
262
263 }
264
265
266
267
268
269 - (void)showLabelWithUserInfo:(NSDictionary *)userInfo color:(UIColor *)color
270
271 {
272
273 UILabel *label = [UILabel new];
274
275 label.backgroundColor = color;
276
277 label.frame = CGRectMake(0, 250, [UIScreen mainScreen].bounds.size.width, 300);
278
279 label.text = userInfo.description;
280
281 label.numberOfLines = 0;
282
283 [[UIApplication sharedApplication].keyWindow addSubview:label];
284
285 }
286
287
288
289
iOS---iOS10适配iOS当前所有系统的远程推送的更多相关文章
- 适配 iOS 8 时遇到的问题两则:远程推送和 Unwind Segue
原文:http://imtx.me/archives/1910.html 昨天我在微博上吐槽:iOS 8 / Xcode 6 真是史上对开发人员最糟糕的版本号了.收到非常多朋友表达同感. 之所以这么说 ...
- 81、iOS本地推送与远程推送详解
一.简介 分为本地推送和远程推送2种.可以在应用没打开甚至手机锁屏情况下给用户以提示.它们都需要注册,注册后系统会弹出提示框(如下图)提示用户石否同意,如果同意则正常使用:如果用户不同意则下次打开程序 ...
- IOS远程推送
IOS远程推送 一.关于推送通知 推送通知,也被叫做远程通知,是在iOS 3.0以后被引入的功能.是当程序没有启动或不在前台运行时,告诉用户有新消息的一种途径,是从外部服务器发送到应用程序上的.一般说 ...
- iOS开发之远程推送
说到远程推送,应该用的也挺多的,今天就基于SEA的云推送服务,做一个推送的小demo,来了解一下iOS中的远程推送是怎么一回事儿,首先你得有苹果的开发者账号,好咸蛋也差不多了,主要内容走起. 一.准备 ...
- IOS本地,APNS远程推送(具体过程)
添加本地推送 ///本地添加 -(void)addLocalPushNotification:(UIButton*)sender; { NSLog(@"%s",__FUNCTION ...
- iOS远程推送原理及实现过程
➠更多技术干货请戳:听云博客 推送通知,是现在的应用必不可少的功能.那么在 iOS 中,我们是如何实现远程推送的呢?iOS 的远程推送原理又是什么呢?在做 iOS 远程推送时,我们会遇到各种各样的问题 ...
- iOS远程推送1
一.APNS 远程推送 1.所有的苹果设备,在联网状态下,都会与苹果服务器建立长连接. 2.长连接:就是只要联网了,就一直建立连接. 3.长连接的作用:时间校准,系统升级,查找我的iPhone. 4. ...
- IOS中程序如何进行推送消息(本地推送,远程推送)2(上)
未看过本地推送的,可以提前看一下本地推送. http://www.cnblogs.com/wolfhous/p/5135711.html =============================== ...
- iOS开发笔记10:圆点缩放动画、强制更新、远程推送加语音提醒及UIView截屏
1.使用CAReplicatorLayer制作等待动画 CALayer+CABasicAnimation可以制作很多简单的动画效果,之前的博客中介绍的“两个动画”,一个是利用一张渐变色图片+CABas ...
随机推荐
- IE6、7下html标签间存在空白符,导致渲染后占用多余空白位置的原因及解决方法
直接上图:原因:该div包含的内容是靠后台进行print操作,输出的.如果没有输出任何内容,浏览器会默认给该空白区域添加空白符.在IE6.7下,浏览器解析渲染时,会认为空白符也是占位置的,默认其具有字 ...
- Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制
将通用的序列号生成器库 从SQL Server迁移到Mysql 遇到的一个问题,就是TimeStamp/RowVersion并发控制类型在非Microsoft SQL Server数据库中的实现.SQ ...
- 使用Visual Studio 2015 开发ASP.NET MVC 5 项目部署到Mono/Jexus
最新的Mono 4.4已经支持运行asp.net mvc5项目,有的同学听了这句话就兴高采烈的拿起Visual Studio 2015创建了一个mvc 5的项目,然后部署到Mono上,浏览下发现一堆错 ...
- Angular企业级开发-AngularJS1.x学习路径
博客目录 有链接的表明已经完成了,其他的正在建设中. 1.AngularJS简介 2.搭建Angular开发环境 3.Angular MVC实现 4.[Angular项目目录结构] 5.[SPA介绍] ...
- jQuery禁用或启用
禁用:.attr("disabled","disabled"); 启用:.removeAttr("disabled");
- 用Kotlin创建第一个Android项目(KAD 01)
原文标题:Create your first Android project using Kotlin (KAD 01) 作者:Antonio Leiva 时间:Nov 21, 2016 原文链接:h ...
- Oracle:一个用户操作多个表空间中表的问题(转)
原文地址:http://blog.csdn.net/shmiloy001/article/details/6287317 首先,授权给指定用户. 一个用户的默认表空间只能有一个,但是你可以试下用下面的 ...
- Hacker Rank: Two Strings - thinking in C# 15+ ways
March 18, 2016 Problem statement: https://www.hackerrank.com/challenges/two-strings/submissions/code ...
- 不要听吹牛逼什么前端MVVM框架就是好,其实都是一帮没学好分层设计的搞出来的,让你彻底看清前端MVVM的本质
最近前端圈子里面,发现大家都在热炒概念,什么knockout,angularJs,都被捧成神了,鄙人不才,最近心情也不好,特地写这篇文章来找骂 写代码的码农都知道,Java社区虽然不是一个提出分层思想 ...
- Web网站中利用JavaScript中ActiveXObject对象获取硬件信息(显示器数量、分辨率)从而进行单双屏跳转
前言:最近这两天工作上,要实现一个功能,在好友阿聪的帮助下,算是比较好的解决了这个需求. B/S的Web网站,需要实现点击按钮时,根据客户端连接的显示屏(监视器)数量进行,单双屏跳转显示新页面. 由于 ...