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. 30天C#基础巩固----查找XML文件元素

    一:XML文档 了解xml文档. 利用代码来创建XML文档. //引用命名空间+using System.Xml; XmlDocument xdoc=new XmlDocument(); XmlDec ...

  2. 三星S4,呼转的来电,在来电界面上不显示的解决方案

    因为工作关系,我有2个号码是呼叫转移到我现在的手机上的,如果有呼叫转移的来电的话,在通话界面里面没有提示该来电是呼叫转移来的.之前我用的诺基亚的,可以看到呼叫转移的来电,在号码的左边有个拐弯的箭头,提 ...

  3. Nancy FormsAuthentication使用

    1.新建UserDatabase类,实现IUserMapper接口 using System; using System.Collections.Generic; using System.Linq; ...

  4. "Hello World!" for the NetBeans IDE

    "Hello World!" for the NetBeans IDE It's time to write your first application! These detai ...

  5. Firemonkey 调整 MainMenu 字型大小 (D10)

    修改 Windows 下的 Style,找到下面二个 Style ,修改其中的 text 内的 font 大小: 将 FMX.Menus.pas 复制到自己的工程目录内,再修改如下内容: constr ...

  6. <记录学习>京东页面最后一天HTML以及css遇到的问题

    遇到的问题及新的知识 1.< &gt表示< >号2.rgba(0,0,0,透明度) opacity:0~1:3.<a href="javascript:voi ...

  7. AWS CloudFront CDN直接全站加速折腾记The request could not be satisfied. Bad request

    ERROR The request could not be satisfied. Bad request. Generated by cloudfront (CloudFront) Request ...

  8. Use a cache

    To create high-performance systems, sometimes you need to cache data. Play has a cache library and w ...

  9. ajax的再次封装!(改进版) —— new与不 new 有啥区别?

    生命不息重构不止! 上一篇写了一下我对ajax的再次封装的方法,收到了很多有价值的回复,比如有童鞋建议用$.extend,一开始还以为要做成插件呢,后来才知道,原来这个东东还可以实现合并.省着自己再去 ...

  10. iCheck.js

    一.iCheck:http://www.bootcss.com/p/icheck/ 1.选择一个颜色主题,网上有,有了一个肤色主题,然后就是把这个肤色主题的css文件复制到iCheck文件夹里面 2. ...