博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOS 远程推送通知(UIRemoteNotification)
阅读量:4940 次
发布时间:2019-06-11

本文共 4565 字,大约阅读时间需要 15 分钟。

●  
什么是远程推送通知

 ●  顾名思义,就是从远程服务器推送客户端的通知(需要联网)

●  远程推送服务,又称为APNs(Apple Push Notification Services)

 

●  为什么需要远程推送通知?

●  传统获取数据的局限性

只要用户关闭了app,就无法跟app的服务器沟通,无法从服务器上获得最新的 数据内容

 

远程推送通知可以解决以上问题

不管用户打开还是关闭app,只要联网了,都能接收到服务器推送的远程通知

 

 

远程推送通知使用须知

所有的苹果设备,在联网状态下,都会与苹果的服务器建立长连接

什么是长连接
只要联网了,就一直建立连接

 

长连接的作用

时间校准
系统升级
查找我的iPhone .....

长连接的好处

数据传输速度快
数据保持最新状态

 

 

 

 

远程推送流程

 

获得DeviceToken的流程

 

1.准备一堆证书(在哪台电脑上用哪台设备调试哪个应用)

>1. CertificateSigningRequest.certSigningRequest:存储着电脑的信息

>2. ios_development.cer :让电脑具备真机调试的功能

 

>3. 利用设备UDID标识在Devices一栏中注册设备

 

 

 >4. 创建App ID(应用的唯一标识,Bundle Identifier)

 

>5. 电脑调试证书 + 设备的UDID + App ID == 描述文件(mobileprovision)

 

>6. 安装证书: ios_development.cer:电脑能真机调试

                     apple_mj_iphone5_heima_qq.mobileprovision
能做的事情:能在某条电脑上利用某条设备调试某个应用 >7. 让某个应用增加推送功能(用到App ID + certSigningRequest) >8.
App ID + certSigningRequest == aps_development.cer
App ID + certSigningRequest == aps_production.cer

 

 

 

最终会产生5个文件
CertificateSigningRequest.certSigningRequest:描述电脑信息
ios_development.cer:电脑调试证书(让电脑具备真机调试功能)
apple_mj_iphone5_heima_qq.mobileprovision:描述文件

 

(在哪台电脑上利用哪台设备调试哪个应用)、

aps_development.cer:推送调试证书(在哪台电脑调试哪个应用的推送服务)

aps_production.cer:推送发布证书

 

 配置应用的Bundle Identifier

 

 

 

 

 

证书配置01 – 创建App ID

 

●  注意

●  远程推送只能在真机上测试!因此先要保证真机调试的环境没有问题!

●  远程推送的第一步是要创建App ID

●  目的是说明哪个App需要使用推送服务

●  为远程推送服务创建的App ID一定要是全称,不能带有*

 

证书配置02 – App ID创建APNs SSL证书

真机调试用的APNs SSL证书:要在哪台电脑上调试具有推送服务的App

 

 

最终得到2APNs SSL证书
APNs Development iOS:真机调试用的证书
APNs Production iOS:发布程序用的证书
 

 

 

证书配置03 – 生成描述文件

 

 

证书配置04 – 安装

 

最终会得到3个文件
aps_development.cer:真机调试用的
aps_production.cer:发布程序用的
netease_news_iphone5_home.mobileprovision:描述文件

建议:先安装cer文件,再安装mobileprovision文件

 

 

 

 

注册远程推送通知

客户端如果想接收APNs的远程推送通知,必须先注册(得到用户的授权)
一般在App启动完毕后就马上注册
- (BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

// 注册远程通知
UIRemoteNotificationType type = UIRemoteNotificationTypeAlert |
UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound;
[application registerForRemoteNotificationTypes:type]; return YES;

}

 

注册成功后会调用AppDelegate的下面方法,得到设备的deviceToken

 - (void)application:(UIApplication *)application

didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{   NSLog(@"%@", deviceToken); }

 

接收远程推送通知

当设备接收到远程推送通知时
如果程序是处于关闭状态,系统会在给用户展示远程推送通知的同时,将程序启动
到后台,并调用AppDelegate的下面方法

 - (void)application:(UIApplication *)application

didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler

可以在这个方法中做些数据下载操作,争取在用户点击通知前,就将数据下载完毕

下载完毕要调用completionHandler这个block,告知下载完毕

completionHandler(UIBackgroundFetchResultNewData);

 

 

点击远程推送通知

当用户点击远程推送通知,会自动打开app,这里有2种情况

app并没有关闭,一直隐藏在后台

app进入前台,并会调用AppDelegate的下面方法(并非重新启动app)

- (void)application:(UIApplication *)applicationdidReceiveRemoteNotification:(UILocalNotification *)notification;

app已经被关闭(进程已死)

启动app,启动完毕会调用AppDelegate的下面方法

- (BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions;

launchOptions参数通过UIApplicationLaunchOptionsRemoteNotificationKey 取出远程推送通知对象

 

 

实例:
#import "HMAppDelegate.h"@implementation HMAppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{    // 注册远程通知服务(第一次注册服务的时候会弹出提醒框,让用户授权)    [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert];                UILabel *label = [[UILabel alloc] init];    label.backgroundColor = [UIColor lightGrayColor];    label.frame = CGRectMake(0, 100, 320, 300);    label.font = [UIFont systemFontOfSize:15];    label.numberOfLines = 0;    [self.window.rootViewController.view addSubview:label];        NSDictionary *userInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];    if (userInfo) {        label.text = [userInfo description];    } else {        label.text = @"直接点击app图标启动的程序";    }    return YES;}/** *  获得了设备想DeviceToken */- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{    NSLog(@"注册远程通知成功----%@", deviceToken);    /**     1.将deviceToken发送给公司的服务器    c330833f 248c4fed e87068b6 c4b90ee8 a2b57119 aac2b93d 3f2eb27f e7d44c8c    c330833f 248c4fed e87068b6 c4b90ee8 a2b57119 aac2b93d 3f2eb27f e7d44c8c     */        /**     2.     */}/** *  接收到远程推送通知时就会调用 */- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{    NSLog(@"接收到远程通知--%@", userInfo[@"userInfo"]);}@end
View Code

 

 

转载于:https://www.cnblogs.com/liuwj/p/6878797.html

你可能感兴趣的文章
osgearth将视点绑定到一个节点上
查看>>
PHP 当前时间秒数+数值,然后再转换成时间。
查看>>
数据交互 axios 的使用
查看>>
bootloader,kernel,initrc
查看>>
Java中jshell脚本
查看>>
performSelector的方法
查看>>
redis
查看>>
BZOJ1645 [Usaco2007 Open]City Horizon 城市地平线
查看>>
配置IIS
查看>>
单例模式详解
查看>>
电商项目(下)
查看>>
[NOIP2015] 子串
查看>>
NSSet和NSArray区别与方法总结
查看>>
Python列表 元组 字典 集合
查看>>
foreach遍历数组、数组的转置与方阵的迹
查看>>
Still unable to dial persistent://blog.csdn.net:80 after 3 attempts
查看>>
HTML超文本标记语言(九)——表单输入类型
查看>>
基于busybox制作mini2440根文件系统及使用nfs挂载
查看>>
信道容量及信道编码原理学习
查看>>
关于信息论中熵、相对熵、条件熵、互信息、典型集的一些思考
查看>>