推送通知
此通知非彼通知。
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 推送通知”详解:从创建到设置到运行
这是一篇编译的文章,内容均出自Parse.com的iOS开发教程,同时作者还提供了视频讲解.本文将带领开发者一步一步向着iOS推送通知的深处探寻,掌握如何配置iOS推送通知的奥义. 介绍一点点背景资料 ...
- iOS推送通知的实现步骤
一.关于推送通知 来源:http://blog.csdn.net/enuola/article/details/8627283 推送通知,也被叫做远程通知,是在iOS 3.0以后被引入的功能.是当程序 ...
- 【PHP】iOS推送通知以及反馈服务
近来项目是完成一个PHP的推送服务器,无论是PHP,APNs还是GCM基本上都是从零开始. 写下一点见解,方便以后继续做代码的搬运工. 因为对PHP跟iOS都不熟悉,可能有错漏...穷孩子没有用过iO ...
- iOS推送通知流程
①注册推送通知使用方法:registerUserNotificationSettings, registerForRemoteNotifications ④APP发送deviceToken到第三方: ...
- Clojure:两步发送iOS推送通知(apns)
首先在project.clj中,添加对notnoop 类库的引用:[com.notnoop.apns/apns "0.2.3"] 然后使用如下方法就可以发送推送消息了: (ns d ...
- iOS 推送通知处理
//这是程序杀死后再通过点击通知进入时调用的方法 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOpti ...
- IOS推送通知測试工具PushMeBaby
下载了PushMeBaby在xcode5里中不能使用.类库变了.须要加入Carbon.framework库.在引用的地方改成: #include <Carbon/Carbon.h>.程序就 ...
- 转:向IOS设备发送推送通知
背景 SMS 和 MMS 消息是由无线运营商通过设备的电话号码向特定设备提供的.实现 SMS/MMS 的服务器端应用程序的开发人员必须费大量精力才能与现有的封闭电信基础架构进行交互(其中包括获取电话号 ...
- iOS推送 再备
这是一篇编译的文章,内容均出自Parse.com的iOS开发教程,同时作者还提供了视频讲解.本文将带领开发者一步一步向着iOS推送通知的深处探寻,掌握如何配置iOS推送通知的奥义. 介绍一点点背景资料 ...
随机推荐
- Eclipse C++开发环境配置(很简洁)
from: https://www.zybuluo.com/ghostfn1/note/303921
- fragment的切换(解决REPLACE的低效)
在项目中切换Fragment,一直都是用replace()方法来替换Fragment.但是这样做有一个问题,每次切换的时候Fragment都会重新实列化,重新加载一次数据,这样做会非常消耗性能用用户的 ...
- 用AutoCompleteTextView实现历史记录提示
自定义AutoCompleteTextView 博客分类: android进阶 android 网上找到的都是同ArrayAdapter一起使用的,有时候需要自定义风格,咋办?follow me! ...
- Android中分页滑动实现总结
手机的屏幕相对较小,因此会出现当有多项内容需要展示而不得不进行分页的情况.例如手机桌面的应用图标的展示.一般一屏可以显示4*4=16个小方块形的应用程序,可以通过左右滑动进行屏幕的选择.而Androi ...
- 学习cocos code ide 的lua编程
装上了cocos code ide,配了路径之后,建立一个默认lua工程,发现无法调试,报错. 问了别人,在cocos2dconstants.lua的613行插入cc.AsyncTaskPool = ...
- Basic: Fisher's transform
来源:http://bbs.chinahrd.net/thread-709742-1-1.html,Kenneth的回答. z = 0.5 * ln [ (1+r)/(1-r) ]" C0 ...
- 001淘淘商城项目:项目的Maven工程搭建
开始一个新的项目,特此记录,资料全部来源于传智播客,感谢. 我们要做一个类似电商的项目.用maven做管理. maven里面主要分为三种工程: 1:pom工程:用在父级工程,聚合工程中 2:war工程 ...
- Java集合系列:-----------07Map架构
我们之前了解了Collection框架,我们再来了解一下Map架构.前面我们讲了Conllection中的List结合,没有讲Collection中的Set集合, 因为Collection框架中的Se ...
- Integer.valueof(null)报错
原文 http://javacat360.iteye.com/blog/2024378 主题 Java 昨天,一同事问我一个问题,估计是他前段日子面试遇到的 问题很简单,String.valueof ...
- PCL 库安装
参考资料: http://www.cnblogs.com/newpanderking/articles/4022322.html VS2010+PCL配置 PCL共有两种安装方式 安全安装版,个人配置 ...