iOS---iOS10适配iOS当前所有系统的远程推送

news/2024/7/20 21:56:42 标签: ios, xcode, objective-c

一、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时: 发送UDIDBundleIDAPNs加密后返回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中, 还需要设置UNUserNotificationCenterdelegate, 并遵守UNUserNotificationCenterDelegate协议.

以及实现下面实现3个方法, 用于处理点击通知时的不同情况的处理

willPresentNotification:withCompletionHandler 用于前台运行

didReceiveNotificationResponse:withCompletionHandler 用于后台及程序退出

didReceiveRemoteNotification:fetchCompletionHandler用于静默推送

1.前台运行 会调用的方法

前台运行: 指的是程序正在运行中, 用户能看见程序的界面.

iOS10会出现通知横幅, 而在以前的框架中, 前台运行时, 不会出现通知的横幅.

代码开始前的设置 

iOS 10 的推送 与原来的都不一样,他把本地的推送 跟 远程的推送结合到一起了,UserNotifications.framework 库。在使用推送的时候,先开启通知的开关。

就是上面这个。当你开启后,xcode 会自动帮你在 项目里面创建一个文件,xxxx.entitlements.

这个文件是系统帮你创建的,不用管它。

在appDeletgate 文件里面需要先导入 UNUserNotificationCenterDelegate 这个代理。他的代理方法分别是

  1. - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler __IOS_AVAILABLE(10.0) __TVOS_AVAILABLE(10.0) __WATCHOS_AVAILABLE(3.0);
  2. - (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  


http://www.niftyadmin.cn/n/282259.html

相关文章

让语言学习更简单的 WordFlow

作为一个英语并不是那么特别好的计算机专业学生&#xff0c;长期积累英语的学习对个人发展还是有意义的。简单来说&#xff0c;我在语言上最大的两个问题&#xff0c;一个自己「不理解」&#xff0c;另一个是自己「不会表达」。 上述两个问题主要体现在口语层面&#xff0c;而…

异构无线传感器网络路由算法研究(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 ​无线传感器网络(Wireless Sensor Networks, WSN)是一种新型的融合传感器、计算机、通信等多学科的信息获取和处理技术的网络,…

【leetcode刷题总结】——代码随想录(数组总结)

代码随想录按照数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心->动态规划->图论->高级数据结构&#xff0c;再从简单刷起&#xff0c;做了几个类型题目之后&#xff0c;再慢慢做中等题目、困难题目。 以下是个人刷题总结&#xff0c;…

在 windows 端使用 vscode + ubuntu WSL 优雅的使用原生 linux 的 gcc/g++ 编译

当我在windows上进行c的开发时&#xff0c;通常会使用 vs 但缺点也比较明显&#xff0c;他不原生的 gcc 编译器&#xff0c;其次 vs 这个 IDE 太过于庞大&#xff0c;当然也有很多人会使用 vscode 但是&#xff0c;在 windows 中安装 gcc/g 的过程极为复杂&#xff0c;且因为我…

JavaScript中的模块化编程

JavaScript是一种强大的编程语言&#xff0c;它可以在浏览器中进行客户端脚本编写&#xff0c;并且在服务器端也有广泛的应用。随着JavaScript应用的增多&#xff0c;JavaScript代码的复杂度也不断增加。为了提高代码的可维护性和重用性&#xff0c;模块化编程变得越来越重要。…

闲谈【Stable-Diffusion WEBUI】的插件:绘图过程动画输出

文章目录 &#xff08;零&#xff09;前言&#xff08;一&#xff09;过程动画输出&#xff08;Steps Animation&#xff09;&#xff08;1.1&#xff09;使用&#xff08;1.2&#xff09;成果 &#xff08;零&#xff09;前言 本篇主要提到WEBUI的过程动画输出插件&#xff0c…

Python基础合集 练习18(类与对象2)

访问限制 class Dog_dog(): def init(self, name) -> None: self.__name name # 定义私有属性 def run(self):print(我跑的很快!我的名字是, self.__name)dog1 Dog_dog(‘papi’) dog1.run() print(dog1._Dog_dog__name) # 加入类名访问 print(’-----分界线-----’) p…

【HTMLCSSJS】写实验发现的一些注意点

&#x1f38a;专栏【 前端易错合集】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 目录 &#x1f6a5;innerHtml和innerText的区别 &#x1f3f…