推送通知

此通知非彼通知。
NSNotification是抽象的,看不见的,但是可以监听,属于观察者模式的一种设计模式。
推送通知是可见的,能用肉眼看见的,是真正的和用户打交道的通知。
推送通知分为两种:
(1)本地推送通知
(2)远程推送通知
作用:可以让不在前台运行的app告知用户app内部发生了什么事情。比如微信、QQ
不在前台有两种情况:一种是程序退出到后台,另一种是程序被杀死。
不管是被杀死还是在后台,都可以接受推送通知。
推送通知的多种呈现效果:一种是从屏幕上方拉出来横幅。一种是在屏幕中间弹出UIElertView。(这种少见)。一种是推送通知的时候有音效。一种是在锁屏状态呈现。还有一种是呈现消息数量。还有一种是通知中心。
推送通知的使用细节:
点击推送通知后,默认会自动打开发出推送通知的app。不管这个app是处于在后台状态还是被杀死状态
 
本地推送通知:
顾名思义,就是不需要联网就能发出推送通知(不需要服务器的支持)
如何发出本地推送通知:
1.创建本地推送通知对象
UILocalNotification *ln = [[UILocalNotification alloc] init];
2,设置本地推送通知的属性
(1)推送通知的触发时间
@property (nonatomic,copy) NSDate *fireDate;
(2)推送通知的具体内容
@property (nonatomic,copy) NSString *alertBody;
 推送通知的触发时间和具体内容属性是必须要设置的。另外,还有一些其他额外的属性,在此不再介绍。
注意,和iOS7不同的是,iOS 8开始,发送通知,需要用户授权允许。一般都是在程序一启动就请求用户允许,所以在didFinishLaunch方法里进行请求,以请求用户允许授权?
所以,需要进行系统版本判断
锁屏快捷键:command + L
 
点击通知跳转到指定界面:
利用application的代理方法 - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
(1)如果应用程序是在前台,依然会收到本地通知,但是收到通知后不应该跳转
(2)如果应用程序在后台,收到本地通知后执行跳转代码
(3)如果应用程序被杀死,收到本地通知后不会执行上面的代理方法里的代码,所以要在didFinishLaunch:withOptions方法里进行跳转
     如果正常启动,launchOptions为null;其他方式启动launchOptions不为空。
     因为程序被其他应用程序打开后也会执行didFinishLaunch:withOptions方法且launchOptions不为空,所以需要过滤掉被其他应用程序打开后也执行跳转的情况,解决方法是判断launchOptions的UIApplicationLaunchOptionsLocalNotificationKey是否有值
 
远程推送通知:
APNs服务:Apple Push Notification Services 苹果远程推送通知服务
不管程序处于什么状态,前台、后台、关闭,只要手机处于联网状态,应用程序都会收到远程推送通知。
所有的苹果设备在联网的状态下都会与苹果的服务器建立一个长连接。
短连接一般是http请求
长连接一般是通过建立socket会话
长连接可以保证服务器主动把消息推送给客户端。
以前短连接的情况下,短连接是客户端主动发起建立的连接(客户端主动请求数据),服务器是无法把消息主动推送给客户端的。
当然也可以通过轮询的方式同步消息,每隔一定时间客户端就和服务器建立一次短连接。
但是相比较长连接,频繁的建立、释放短连接会非常消耗服务器的性能;并且会产生消息同步不及时的情况。
长连接的另一个功能:
时间校正(苹果设备不需要更新时间)。
版本更新(系统更新版本)。
查找我的iPhone(iCloud服务器会给客户端发送位置请求请求客户端的位置)。
远程推送的原理:
客户端和服务器通过长连接保持通信,实现远程推送。具体来讲:客户端通过定期给服务器发送心跳包来保持长连接。如果服务器一定时间内或者连续几次没有收到客户端的心跳包,那么服务器就会断开和这个客户端的长连接。断开的原因是服务为和客户端的关系是一对多的,繁忙的时候并发数非常大,一个服务器很有可能同时和百万个客户端保持着长连接,如此导致服务器的压力非常大,为了节省服务器的性能和内存开销,所以需要断开不必要的长连接。
客户端app处于前台状态下,app服务器可以通过长连接向客户端app发送消息。
当客户端app退出到后台或者程序被杀死,客户端app和app服务器就会断开长连接,那么app服务器无法向客户端app推送通知。此时就需要借助于苹果的APNs服务器进行远程推送,只有当客户端app处于后台或者被杀死的情况下才会由APNs服务器推送。
苹果的APNs服务器和每个设备有一个长连接,专门服务于远程推送通知。所以,app服务器可以把消息发送给苹果的APNs服务器。苹果的APNs服务器可以代替该app服务器把消息通过远程通知的方式推送到指定的设备的指定app上,这就实现了远程推送通知。
APNs服务器如何找到指定设备的指定app呢?
通过device token,device token是设备的UDID和应用程序的bundle identifier加密而来的。可以通过UDID定位到某个具体的设备,然后通过bundle identifier定位到某个具体的应用。实现远程通知的精准推送。
如上图:
前期:
(1)客户端app发送设备的UDID和应用的Bundle Identifier给苹果的APNs服务器。
(2)苹果的APNs服务器会把二者加密生成一个deviceToken返回给客户端app。
(3)客户端app把当前用户的deviceToken和用户的标志(比如某个QQ号码或者id)发送给app服务器。
(4)app服务器把这些数据存储到数据库。
后期:
(5)李四给张三发送QQ消息数据,该数据包括消息体和双方的QQ号码等。
(6)QQ服务器根据QQ号码等信息去数据库查询该号码对应的deviceToken。
(7)QQ服务器把查询到的deviceToken和QQ消息数据一并推送给苹果的APNs服务器。
(8)苹果的APNs服务器通过查找之前注册过的deviceToken找到张三的设备,进而再通过deviceToken把消息数据推送给张三的设备上的QQ应用的张三的QQ账号。
 

iOS推送通知的更多相关文章

  1. “iOS 推送通知”详解:从创建到设置到运行

    这是一篇编译的文章,内容均出自Parse.com的iOS开发教程,同时作者还提供了视频讲解.本文将带领开发者一步一步向着iOS推送通知的深处探寻,掌握如何配置iOS推送通知的奥义. 介绍一点点背景资料 ...

  2. iOS推送通知的实现步骤

    一.关于推送通知 来源:http://blog.csdn.net/enuola/article/details/8627283 推送通知,也被叫做远程通知,是在iOS 3.0以后被引入的功能.是当程序 ...

  3. 【PHP】iOS推送通知以及反馈服务

    近来项目是完成一个PHP的推送服务器,无论是PHP,APNs还是GCM基本上都是从零开始. 写下一点见解,方便以后继续做代码的搬运工. 因为对PHP跟iOS都不熟悉,可能有错漏...穷孩子没有用过iO ...

  4. iOS推送通知流程

    ①注册推送通知使用方法:registerUserNotificationSettings, registerForRemoteNotifications ④APP发送deviceToken到第三方: ...

  5. Clojure:两步发送iOS推送通知(apns)

    首先在project.clj中,添加对notnoop 类库的引用:[com.notnoop.apns/apns "0.2.3"] 然后使用如下方法就可以发送推送消息了: (ns d ...

  6. iOS 推送通知处理

    //这是程序杀死后再通过点击通知进入时调用的方法 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOpti ...

  7. IOS推送通知測试工具PushMeBaby

    下载了PushMeBaby在xcode5里中不能使用.类库变了.须要加入Carbon.framework库.在引用的地方改成: #include <Carbon/Carbon.h>.程序就 ...

  8. 转:向IOS设备发送推送通知

    背景 SMS 和 MMS 消息是由无线运营商通过设备的电话号码向特定设备提供的.实现 SMS/MMS 的服务器端应用程序的开发人员必须费大量精力才能与现有的封闭电信基础架构进行交互(其中包括获取电话号 ...

  9. iOS推送 再备

    这是一篇编译的文章,内容均出自Parse.com的iOS开发教程,同时作者还提供了视频讲解.本文将带领开发者一步一步向着iOS推送通知的深处探寻,掌握如何配置iOS推送通知的奥义. 介绍一点点背景资料 ...

随机推荐

  1. vijos[1355]车队过桥问题

    描述 现有N辆车要按顺序通过一个单向的小桥,由于小桥太窄,不能有两辆车并排通过.另外,由于小桥建造的时间已经很久,只能承受有限的重量,记为Max(吨).管理员将N辆车按初始的顺序分组,每次让一个组过桥 ...

  2. Oracle 中 decode 函数用法(转)

    含义解释: decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下: IF 条件=值1 THEN RETURN(翻译值1) ELSIF 条件=值2 THE ...

  3. facebook graphql

    思想先进,前端直接从后台调用所需要的数据. 最简单的理解: 从"select * from 学生表" 进化为"select name, sex from 学生表" ...

  4. vijos P1448 校门外的树

    描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的--如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:\(K=1\),读入\(l, ...

  5. [转]spring 注入静态变量

    原文: http://www.cnblogs.com/xing901022/p/4168124.html 今天碰到一个问题,我的一个工具类提供了几种静态方法,静态方法需要另外一个类的实例提供处理,因此 ...

  6. 网络/运维工程师visio2013模具图标 绘制漂亮的网络拓扑图 狮子XL工程师美学思想

    visio2013狮子XL自定义运维模具下载: 链接:http://pan.baidu.com/s/1bo779Kz 密码:xh3s 狮子XL 的美学思想: 1,一次痛苦,一生幸福. 之前,在绘制网络 ...

  7. C#并发编程经典实例--笔记

    一.简介   --并发         同时做多件事情 --多线程         并发的一种形式,它采用多个线程来执行程序.             **如非必要,代码里不要出现 "new ...

  8. Spring Security笔记:使用BCrypt算法加密存储登录密码

    在前一节使用数据库进行用户认证(form login using database)里,我们学习了如何把“登录帐号.密码”存储在db中,但是密码都是明文存储的,显然不太讲究.这一节将学习如何使用spr ...

  9. Chrome 监听 console 打开

    这个算是 Chrome only 其他的我没测试,也不想测试.因为我的控制台脚本仅仅在 Chrome 下加载. 如果你需要全平台,那么这肯定不是你需要的结果. 需求 其实我很早就想折腾这个了,但是,, ...

  10. Zepto的天坑汇总

    前言 最近在做移动端开发,用的是zepto,发现他跟jquery比起来称之为天坑不足为过,但是由于项目本身原因,以及移动端速度要求的情况下,也只能继续用下去. 所以在这里做一下汇总 对img标签空sr ...