1.什么是推送通知

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

2.推送通知的5种形式

3.推送通知的特点

  1. App关闭时,可以接收通知并显示
  2. App打开并处于后台时,通知会显示
  3. App打开并处于前台时,通知不会显示
  4. 点击通知后,默认会自动打开发出通知的App

4.远程推送通知

  1. 在联网的情况下,由远程服务器推送给客户端的通知,又称APNs(Apple Push Notification Services)
  2. 不管应用是打开还是关闭的情况下,都能接收到服务器推送的远程通知

5.远程通知的实现基础

  • 在联网状态下,所有苹果设备都会与苹果服务器建立长连接
    1. 长连接的作用:时间校准,系统升级,查找我的iPhone
    2. 长连接的好处:数据传输速度快,数据保持最新状态

6.远程推送的实现原理

  1. 安装App时
    1. 发送UDID和BundleID给APNs加密后返回deviceToken
    2. 登陆服务时,将用户身份和deviceToken发给服务器,服务器记录
  2. 李四给张三发消息
    1. 发送消息及张三的用户身份
    2. 服务器按照张三的身份找到存储的deviceToken,将消息和deviToken发送给APNs
    3. APNs通过deviceToken推送消息给张三

7.实现远程推送功能的前提

  1. 真机
  2. 调试阶段的证书
    1. aps_development.cer 电脑可以调试有推送功能的app的证书
    2. iOS_development.cer 电脑可以真机调试的证书
    3. xxx.mobileprovision 描述文件,其中确定了哪台手机和电脑可以进行调试
  3. 发布阶段的证书
    1. aps.cer 用该证书中说明的那台电脑发布的app具有远程推送功能时,用来使该app有推送功能的证书
    2. iOS_distribution.cer 电脑有发布app的能力的证书
    3. xxx.mobileprovision 描述文件,其中描述了哪台电脑可以发布app

8.实现远程推送功能的步骤

  1. 在启动方法中注册通知
  2. 注册成功后收到设备的deviceToken
  3. 实现用户点击通知后的响应(两种情况)
    1. 程序没有关闭,在后台实现AppDelegate中的didReceiveRemoteNotification方法
    2. 程序已经关闭,执行AppDelegation中的didFinishesLaunchingWithOption方法

9.远程推送的具体实现过程

  1. 去开发者平台,生成两个支持远程推送的证书
  2. 先点击App IDS添加一个准确的可以支持push功能的应用程序的BundleID
  3. 到生成的证书的那个节点下,先添加一个development阶段的支持push功能的cer文件
  4. 到最后一个provision节点下添加一个development阶段的支持push功能创建的那个App ID,cer文件要选择最新生成的支持push功能的cer文件,最后生成,下载,双击安装
  5. 为了确定cer文件和provision文件安装成功,可以到钥匙串和Xcode中的设备节点中分别查看(远程推送证书的申请流程请移步http://www.cnblogs.com/czq1989/p/5311302.html)
  6. 新建一个工程,先修改info.plist文件中Bundle ID为第二步创建的那个ID
  7. 为了兼容7.0所以修改配置中的deployment target为7.0
  8. 在AppDelegate中,发请求,询问是否要开通push功能,如果用户点击允许,则接收从服务器端发回的deviceToken(需要真机联网)
  9. 配置通过点击了通知打开应用程序后要做的事情,可以在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

  1. 作用:测试APNs的开源Mac项目,充当服务器,可以将内容提交给苹果的APNs服务器,然后APNs服务器再推送内容给用户的设备
  2. 使用
    1. 注销报错的代码
    2. 修改ApplicationDelegate.m文件中self.deviceToken
    3. 添加推送证书到项目中,并改名为apns.cer
    4. 运行填写信息,点击Push按钮完成发送
    5. 注意:出现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 远程推送通知的更多相关文章

  1. IOS 远程推送通知(UIRemoteNotification)

    ●  什么是远程推送通知 ●  顾名思义,就是从远程服务器推送给客户端的通知(需要联网) ●  远程推送服务,又称为APNs(Apple Push Notification Services) ●   ...

  2. iOS 远程推送通知 详解

    1: ios本地通知和远程通知 http://wangjun.easymorse.com/?p=1482 2: 苹果远程通知服务申请激活例图 (外国佬写的.) http://mobiforge.com ...

  3. 转:IOS远程推送通知

    在ios系统中,app应用程序无法在后台完成较多的任务,仅仅允许程序做一些有限的任务(如音视频播放.地理位置信息.voip).然而,如果你想做 一些有趣的事情,并且告知用户,甚至用户没有使用你的app ...

  4. IOS之推送通知(本地推送和远程推送)

    推送通知和NSNotification是有区别的: NSNotification:是看不到的 推送通知:是可以看到的 IOS中提供了两种推送通知 本地推送通知:(Local Notification) ...

  5. IOS远程推送

    IOS远程推送 一.关于推送通知 推送通知,也被叫做远程通知,是在iOS 3.0以后被引入的功能.是当程序没有启动或不在前台运行时,告诉用户有新消息的一种途径,是从外部服务器发送到应用程序上的.一般说 ...

  6. iOS远程推送原理及实现过程

    ➠更多技术干货请戳:听云博客 推送通知,是现在的应用必不可少的功能.那么在 iOS 中,我们是如何实现远程推送的呢?iOS 的远程推送原理又是什么呢?在做 iOS 远程推送时,我们会遇到各种各样的问题 ...

  7. iOS远程推送1

    一.APNS 远程推送 1.所有的苹果设备,在联网状态下,都会与苹果服务器建立长连接. 2.长连接:就是只要联网了,就一直建立连接. 3.长连接的作用:时间校准,系统升级,查找我的iPhone. 4. ...

  8. iOS 10推送通知开发

    原文地址:Developing Push Notifications for iOS 10,译者:李剑飞 虽然通知经常被过度使用,但是通知确实是一种获得用户关注和通知他们需要更新或行动的有效方式.iO ...

  9. (七十三)iOS本地推送通知的实现

    iOS的推送通知分为本地推送和网络推送两种,如果App处于挂起状态,是可以发送本地通知的,如果已经被杀掉,则只有定时通知可以被执行,而类似于QQ的那种网络消息推送就无法实现了,因为App的网络模块在被 ...

随机推荐

  1. Emit学习(2) - IL - 常用指令介绍

    学习Emit必不可少的, 会使用到IL中间代码. 初见IL代码, 让我有一种汇编的感觉, 让我想起了, 大学时, 学习8051的汇编语言. 多的就不扯了, 直接进入正题, OpCodes指令集是不是有 ...

  2. 打开IE错误解决方法

    1. 502.1 Internal Server Error Handle svc-Integraged has a bad module ManagedPipelineHandle解决方法:此种情况 ...

  3. javascript设计模式实践之代理模式--图片预加载

    图片的预加载就是在加载大图片前,先显示一个loading.gif,就算在网络比较慢的时候也能让人知道正在加载,总比啥反应都没有强. 下面这段代码就是预加载的一个简单的实现,假设先不处理加载图片时的on ...

  4. 对TabControl的简单优化

    之前由于忙于赶项目进度而忽视了软件的用户体验,界面挺难看,有一天看见组长优化了某个窗体,让人感觉完全不一样,我也不甘示弱,要把我的程序做顺眼一点才行.我的程序是一个以TabControl为主要容器的窗 ...

  5. iOS 阶段学习第八天笔记(指针)

    iOS学习(C语言)知识点整理 一.指针 1)概念:存储变量的地址的一个变量. 2) 数据存储类型分析 1.text (代码段) :存储二进制的可执行代码 2.data(初始化的数据段) 存储初始化的 ...

  6. 【C#】第3章学习要点(一)--整体把握

    分类:C#.VS2015 创建日期:2016-06-18 使用教材:(十二五国家级规划教材)<C#程序设计及应用教程>(第3版) 一.使用别人已经设计好的类简化你的代码编写工作量 当让你去 ...

  7. 使用DataConnectionDialog在运行时设置数据源连接字符串

    介绍: DataConnectionDialog 类: 打开“数据连接”对话框,获取用户选择的数据连接信息. 命名空间为:Microsoft.Data.ConnectionUI 所在程序集:Micro ...

  8. 点击显示div

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. idea IntelliJ IDEA 2016.2破解

    从2016-08-06开始全面切到HTTPS访问模式,而IntelliJ IDEA的License server不支持HTTPS访问,所以本博客将IntelliJ IDEA的在线注册码生成页面转到了h ...

  10. Firemonkey TEdit 切换不同 KeyboardType 样式

    用代码切换 Edit 不同的键盘样式: procedure TForm1.Button1Click(Sender: TObject); begin Edit1.KeyboardType := TVir ...