iOS 远程推送通知
1.什么是推送通知
- 在某些特殊情况下,应用程序被动收到的以不同种界面形式出现的提醒信息
- 推送通知的作用:可以让不在前台运行的app通知app发生了改变
- iOS中得推送通知种类
- 远程推送通知(Remote Notification)
- 本地推送通知(Local Notification)
2.推送通知的5种形式

3.推送通知的特点
- App关闭时,可以接收通知并显示
- App打开并处于后台时,通知会显示
- App打开并处于前台时,通知不会显示
- 点击通知后,默认会自动打开发出通知的App
4.远程推送通知
- 在联网的情况下,由远程服务器推送给客户端的通知,又称APNs(Apple Push Notification Services)
- 不管应用是打开还是关闭的情况下,都能接收到服务器推送的远程通知
5.远程通知的实现基础
- 在联网状态下,所有苹果设备都会与苹果服务器建立长连接
- 长连接的作用:时间校准,系统升级,查找我的iPhone
- 长连接的好处:数据传输速度快,数据保持最新状态
6.远程推送的实现原理


- 安装App时
- 发送UDID和BundleID给APNs加密后返回deviceToken
- 登陆服务时,将用户身份和deviceToken发给服务器,服务器记录
- 李四给张三发消息
- 发送消息及张三的用户身份
- 服务器按照张三的身份找到存储的deviceToken,将消息和deviToken发送给APNs
- APNs通过deviceToken推送消息给张三
7.实现远程推送功能的前提
- 真机
- 调试阶段的证书
- aps_development.cer 电脑可以调试有推送功能的app的证书
- iOS_development.cer 电脑可以真机调试的证书
- xxx.mobileprovision 描述文件,其中确定了哪台手机和电脑可以进行调试
- 发布阶段的证书
- aps.cer 用该证书中说明的那台电脑发布的app具有远程推送功能时,用来使该app有推送功能的证书
- iOS_distribution.cer 电脑有发布app的能力的证书
- xxx.mobileprovision 描述文件,其中描述了哪台电脑可以发布app
8.实现远程推送功能的步骤
- 在启动方法中注册通知
- 注册成功后收到设备的deviceToken
- 实现用户点击通知后的响应(两种情况)
- 程序没有关闭,在后台实现AppDelegate中的didReceiveRemoteNotification方法
- 程序已经关闭,执行AppDelegation中的didFinishesLaunchingWithOption方法
9.远程推送的具体实现过程
- 去开发者平台,生成两个支持远程推送的证书
- 先点击App IDS添加一个准确的可以支持push功能的应用程序的BundleID
- 到生成的证书的那个节点下,先添加一个development阶段的支持push功能的cer文件
- 到最后一个provision节点下添加一个development阶段的支持push功能创建的那个App ID,cer文件要选择最新生成的支持push功能的cer文件,最后生成,下载,双击安装
- 为了确定cer文件和provision文件安装成功,可以到钥匙串和Xcode中的设备节点中分别查看(远程推送证书的申请流程请移步http://www.cnblogs.com/czq1989/p/5311302.html)
- 新建一个工程,先修改info.plist文件中Bundle ID为第二步创建的那个ID
- 为了兼容7.0所以修改配置中的deployment target为7.0
- 在AppDelegate中,发请求,询问是否要开通push功能,如果用户点击允许,则接收从服务器端发回的deviceToken(需要真机联网)
- 配置通过点击了通知打开应用程序后要做的事情,可以在AppDelegate中通过实现didReceiveRemoteNotification方法,就可以获取到用户点击了通知这个动作
10.远程推送过程中AppDelegate中所要响应的方法
下面的方法都是写在AppDelegate.m文件中
/*
1.有一种打开,叫做点击图标后的打开
2.还有一种打开,叫做 点击了 通知 之后的打开
当通过 点击通知 这种方法打开应用程序,执行didFinishLaunching方法时,launchOptions
参数中,就存着通知发来的消息,也就是 类似于
didReceiveRemote方法中的那个userInfo
*/
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if ([UIDevice currentDevice].systemVersion.doubleValue <= 8.0) {
//向服务器发请求,要注册推送功能,以此获取到服务器返回的deviceToken
//type 用来说明 支持的通知形式
//如 横幅 声音 角标
[application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert];
}else{
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge| UIUserNotificationTypeSound|UIUserNotificationTypeAlert categories:nil];
[application registerUserNotificationSettings:settings];
//申请使用通知
[application registerForRemoteNotifications];
}
NSDictionary *userInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
UILabel *label = [[UILabel alloc]init];
label.frame = CGRectMake(, , , );
label.numberOfLines = ;
label.textColor = [UIColor whiteColor];
label.font = [UIFont systemFontOfSize:];
label.backgroundColor = [UIColor blueColor];
label.text =[NSString stringWithFormat:@"%@",userInfo];
[self.window.rootViewController.view addSubview:label];
return YES;
} //只要获取到用户同意,则服务器端返回deviceToken
//会自动执行下面的方法
//1417f54c c7f0adb0 48e3558f 2b8a8bad 0a6a5152 54af017e 32137cda 8cbdb9d0
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSLog(@"%@",deviceToken);
} /*
用户点击了通知,进入到应用程序中,需要捕获到这个时机
从而决定这一次的进入应用程序,到底要显示或执行什么动作,下面的方法就会在点击通知时自动调用
*/
/*
1.应用程序在前台时:通知到,该方法自动执行
2.应用程序在后台且没有退出时:通知到,只有点击了通知查看时,该方法自动执行
3.应用程序退出:通知到,点击查看通知,不会执行下面的didReceive方法,而是只执行didFinishLauncing方法
*/
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
//NSLog(@"%@",userInfo);
//为了测试在应用程序退出后,该方法是否执行
//所以往第一个界面上添加一个label,看标签是否会显示一些内容
UILabel *label = [[UILabel alloc]init];
label.frame = CGRectMake(, , , );
label.numberOfLines = ;
label.textColor = [UIColor whiteColor];
label.font = [UIFont systemFontOfSize:];
label.backgroundColor = [UIColor grayColor];
label.text =[NSString stringWithFormat:@"%@",userInfo];
[self.window.rootViewController.view addSubview:label];
} /*
此方法是新的用于响应远程推送通知的方法
1.如果应用程序在后台,则通知到,点击查看,该方法自动执行
2.如果应用程序在前台,则通知到,该方法自动执行
3.如果应用程序被关闭,则通知到,点击查看,先执行didFinish方法,再执行该方法
4.可以开启后台刷新数据的功能
step1:点击target-->Capabilities-->Background Modes-->Remote Notification勾上
step2:在给APNs服务器发送的要推送的信息中,添加一组字符串如:
{"aps":{"content-available":"999","alert":"bbbbb.","badge":1}}
其中content-availabel就是为了配合后台刷新而添加的内容,999可以随意定义
*/
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
UILabel *label = [[UILabel alloc]init];
label.frame = CGRectMake(, , , );
label.numberOfLines = ;
label.textColor = [UIColor whiteColor];
label.font = [UIFont systemFontOfSize:];
label.backgroundColor = [UIColor grayColor];
label.text =[NSString stringWithFormat:@"%@",userInfo];
[self.window.rootViewController.view addSubview:label];
//NewData就是使用新的数据 更新界面,响应点击通知这个动作
completionHandler(UIBackgroundFetchResultNewData);
}
11.PushMeBaby
- 作用:测试APNs的开源Mac项目,充当服务器,可以将内容提交给苹果的APNs服务器,然后APNs服务器再推送内容给用户的设备
- 使用
- 注销报错的代码
- 修改ApplicationDelegate.m文件中self.deviceToken
- 添加推送证书到项目中,并改名为apns.cer
- 运行填写信息,点击Push按钮完成发送
- 注意:出现SSLwrite():-36 94错误 http://www.cnblogs.com/czq1989/p/5314940.html
无法拿到证书的路径:http://www.cnblogs.com/czq1989/p/5312146.html


demo:https://github.com/TigerCui/RemoteNotificationDemo.git
iOS 远程推送通知的更多相关文章
- IOS 远程推送通知(UIRemoteNotification)
● 什么是远程推送通知 ● 顾名思义,就是从远程服务器推送给客户端的通知(需要联网) ● 远程推送服务,又称为APNs(Apple Push Notification Services) ● ...
- iOS 远程推送通知 详解
1: ios本地通知和远程通知 http://wangjun.easymorse.com/?p=1482 2: 苹果远程通知服务申请激活例图 (外国佬写的.) http://mobiforge.com ...
- 转:IOS远程推送通知
在ios系统中,app应用程序无法在后台完成较多的任务,仅仅允许程序做一些有限的任务(如音视频播放.地理位置信息.voip).然而,如果你想做 一些有趣的事情,并且告知用户,甚至用户没有使用你的app ...
- IOS之推送通知(本地推送和远程推送)
推送通知和NSNotification是有区别的: NSNotification:是看不到的 推送通知:是可以看到的 IOS中提供了两种推送通知 本地推送通知:(Local Notification) ...
- IOS远程推送
IOS远程推送 一.关于推送通知 推送通知,也被叫做远程通知,是在iOS 3.0以后被引入的功能.是当程序没有启动或不在前台运行时,告诉用户有新消息的一种途径,是从外部服务器发送到应用程序上的.一般说 ...
- iOS远程推送原理及实现过程
➠更多技术干货请戳:听云博客 推送通知,是现在的应用必不可少的功能.那么在 iOS 中,我们是如何实现远程推送的呢?iOS 的远程推送原理又是什么呢?在做 iOS 远程推送时,我们会遇到各种各样的问题 ...
- iOS远程推送1
一.APNS 远程推送 1.所有的苹果设备,在联网状态下,都会与苹果服务器建立长连接. 2.长连接:就是只要联网了,就一直建立连接. 3.长连接的作用:时间校准,系统升级,查找我的iPhone. 4. ...
- iOS 10推送通知开发
原文地址:Developing Push Notifications for iOS 10,译者:李剑飞 虽然通知经常被过度使用,但是通知确实是一种获得用户关注和通知他们需要更新或行动的有效方式.iO ...
- (七十三)iOS本地推送通知的实现
iOS的推送通知分为本地推送和网络推送两种,如果App处于挂起状态,是可以发送本地通知的,如果已经被杀掉,则只有定时通知可以被执行,而类似于QQ的那种网络消息推送就无法实现了,因为App的网络模块在被 ...
随机推荐
- 自己实现简单Web服务器,支持GET POST请求
最近项目上遇到一个需求,最后想到的解决方案是自己实现一个web服务器去处理请求,然后再将信息发送到另外一个程序.然后返回处理之后的结果呈现出来. 现在我就来分享一下如何实现的. 通过.NET 为我们提 ...
- 【VBS】vbs指定编码保存文本文件(含xml、ini什么的)
本文还是折腾安装包期间衍生出来的产物. 我那安装包在安装期间有这个动作: - 让用户填写一些信息,待安装完成后把这些信息写入软件安装目录中的指定ini.xml文件中 上文说的是如何用vbs写ini,i ...
- javascript定时器,取消定时器,及js定时器优化方法
通常用的方法: 启动定时器: window.setInterval(Method,Time) Method是定时调用的js方法 Time是间隔时间,单位是毫秒 取消定时器: clearInterval ...
- WPF的一些总是记不住的Tips
Margin(Left,Top,Right,Bottom); HorizontalAlignment(Height的Opposite,水平对齐方式):VerticalAlignment(Width的反 ...
- 孙鑫MFC学习笔记6:菜单编程
1.对菜单响应的顺序: 视类,文档类,框架类,应用程序类 2.消息的分类 3.CWnd继承自CCmdTarget类, 所以从CWnd派生出的类也可以接收WM_COMMAND消息 4.命令的消息路由 5 ...
- 发出HTTP请求并获得HTTP响应
发出HTTP请求并获得HTTP响应的过程如下: (1)定义HTTP请求HttpPut(HttpPost/HttpGet/HttpDelete)等: (2)定义各种Header,并加入HttpPut中: ...
- C语言文件方式输入与输出(最简洁方便实用的一种方式)
freopen("inputfile.txt", "r", stdin); freopen("outputfile.txt", " ...
- dubbo管理控制台安装
官网提供的下载路径好像不能用了,我也是在网上找的包,现在提供下载路径:http://pan.baidu.com/s/1nvPHQvZ 下载下来了,把他解压到wabapps->ROOT里面,先把t ...
- Scalaz(24)- 泛函数据结构: Tree-数据游览及维护
上节我们讨论了Zipper-串形不可变集合(immutable sequential collection)游标,在串形集合中左右游走及元素维护操作.这篇我们谈谈Tree.在电子商务应用中对于xml, ...
- [moka同学笔记]YII2.0 判断签约状态,sql的两种查询方法
方法一: //判断签约状态 $signed = 0; $sql="SELECT * from usho_community_sign_record WHERE com_id=$r->i ...