IOS之推送通知(本地推送和远程推送)
推送通知和NSNotification是有区别的:
NSNotification:是看不到的
推送通知:是可以看到的
IOS中提供了两种推送通知
本地推送通知:(Local Notification):手机应用本身的通知,比如:闹铃
远程推送通知:(Remote Notification)从服务器发送过来的通知
推送通知的作用:让不在前台运行的App,告知用户App内部发生了什么事情.比如我们正在聊微信,突然界面上面出现了黑色半透明横幅(QQ好友给你发送的消息)这就是一个推送通知.
推送通知的呈现效果:
1:在屏幕顶部显示一块横幅(显示具体内容)
2:在屏幕中间弹出一个UIAlertView(显示具体内容)
3:还可以在呈现推送通知的同时播放音效(提醒作用)
4:屏幕锁屏时也照样呈现(显示具体内容)
5:呈现推送通知的同时,还可以更新App图标右上角的数字(说明新内容的数量)
6:用户接收的推送通知,都会展示在通知中心(手指从屏幕顶部往下拉的窗口)(显示具体的内容)
推送通知的使用细节:
StartFragment
1:发出推送通知时,如果当前程序正运行在前台,那么推送通知就不会被呈现出来
2:点击推送通知后,默认会自动打开发出推送通知的app
3:不管app打开还是关闭,推送通知都能如期发出
什么是本地推送通知:
顾名思义,就是不需要联网的就能发出的推送通知(不需要服务器的支持)
本地推送通知的使用场景:
常用来定时提醒用户完成一些任务,比如:清理垃圾,记账,购物,买衣服,看电影
如何发出本地推送通知:
步骤:
1:注册通知类型(IOS8以后)
2:创建本地推送通知对象
3:定制一个通知
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//1 :IOS8以后需要注册通知类型,包含哪些(声音,图标文字,)信息,
/*
UIUserNotificationTypeNone = 0
UIUserNotificationTypeBadge = 1 << 0 包含图标文字(左上角的数字)0001
UIUserNotificationTypeSound = 1 << 1 声音 ----------------->0010
UIUserNotificationTypeAlert = 1 << 2 主题内容--------------->0100
目前是:0111,这个值是数值,下面的|||之间的内容相当于数值
*/
// |:位移运算符
UIUserNotificationSettings *seting=[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
[[UIApplication sharedApplication]registerUserNotificationSettings:seting];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
//告诉它有一个本地通知
//2:创建一个本地推送通知对象
UILocalNotification*local=[[UILocalNotification alloc]init];
/*
// timer-based scheduling 特定的时间发出通知
@property(nonatomic,copy) NSDate *fireDate;触发时间
@property(nonatomic,copy) NSTimeZone *timeZone;时区
@property(nonatomic) NSCalendarUnit repeatInterval;重复间隔
@property(nonatomic,copy) NSCalendar *repeatCalendar;重复间隔
@property(nonatomic,copy) CLRegion *region NS_AVAILABLE_IOS(8_0);区域
@property(nonatomic,assign) BOOL regionTriggersOnce NS_AVAILABLE_IOS(8_0);决定区域的一个BOOL值
// alerts警告
@property(nonatomic,copy) NSString *alertBody; 提醒的主题
@property(nonatomic) BOOL hasAction; NO不显示滑动解锁按钮 反之显示
@property(nonatomic,copy) NSString *alertAction; 滑动解锁的文字
@property(nonatomic,copy) NSString *alertLaunchImage; 点击通知横幅的时候启动程序的启动 图片
@property(nonatomic,copy) NSString *alertTitle 提示的标题文字NS_AVAILABLE_IOS(8_2);
// sound
@property(nonatomic,copy) NSString *soundName; 伴随的声音,默认的是UILocalNotificationDefaultSoundName
// badge
@property(nonatomic) NSInteger applicationIconBadgeNumber;图标右上角的数字
// user info
@property(nonatomic,copy) NSDictionary *userInfo;用户指定的携带参数,转换成键值对放在字典里面
@property (nonatomic, copy) NSString *category NS_AVAILABLE_IOS(8_0);分类
*/
//给这些属性赋值才能让通知有特定的内容
local.alertBody=@"女神:在吗?";
//特定的时间让显示出来(从现在5秒后显示出来)
local.fireDate=[NSDate dateWithTimeIntervalSinceNow:5];
//滑动解锁的文字(在推送通知信息的下面一小行字)
local.alertAction =@"约";
//有声音给声音,没声音用默认的
local.soundName=@"UILocalNotificationDefaultSoundName";
//设置图标右上角数字
local.applicationIconBadgeNumber=19;
//用户信息
local.userInfo=@{@"name":@"女神",@"content":@"在不",@"time":@"20180101"};
//3:定制一个通知
[[UIApplication sharedApplication]scheduleLocalNotification:local];
}
@end
什么是远程推送?
远程:从远程服务器推送给客户端的通知(需要联网)
从服务器发送了一个通知,接收到通知以后做的和本地通知类似的事情,这个通知只不过是从远方的服务器传过来的,
要做的这个远程推送通知是由远程推送服务,又称为APNs(Apple Push Notification Services:苹果推送通知服务),苹果给我们提供了这个服务就可以做远程推送服务了.
为什么要用苹果的服务器?-->我们都知道,程序在活着的时候是可以跟自己的服务器进行交互的(程序活着可以执行代码),但只要用户关闭了app,就无法跟app的服务器沟通,无法从服务器上获得最新的数据内容.我们在使用QQ的时候,即使没有登录QQ也能收到信息,这就是用远程推送通知做的.不管登陆还是没有登陆QQ,都可以接收到,但前提是必须要联网.
远程推送通知使用须知:所有的苹果设备在联网状态下,都会与苹果的设备建立长连接(只要建立连接,想发送数据,随时都可以发送, 始终保持连接),苹果有一个服务器集群,跟所有的苹果设备建立长连接
长连接的作用:时间校准,系统升级,查找我的iPhone,
长连接的好处:数据保持最新状态,数据传输快(以前的连接需要根据协议握几次手,苹果的直接就是已经连接了).
只要和评估偶的设备保持长连接就享受苹果的APNs服务,举个例子:
比如说我AgentLXJ现在有一部IPhone手机,手机里面有很多应用比如QQ,QQ有服务器吧,我的手机现在联网并且QQ软件要打开,陌陌的服务器就可以和我交互,我想传递消息,或者我接收到了消息,陌陌服务器金额以直接的告诉我.如果退出了QQ(不是卸载),但我的手机还在联网,这时QQ就不能给我推送消息,这时候苹果的服务就可以,只要我的手机在联网状态下(苹果建立的就是长连接),苹果要给我推送消息要是知道是哪个设备,怎么区分是哪一台设备呢?我们的手机都有自己的唯一标识,有了设备的唯一标识就知道推送给哪一台设备,但是还有一个问题,我的手机上不可能只有QQ这么一个软件,比如还有微信,陌陌等软件,所以苹果还要知道软件的BundleID(应用程序的唯一标识),有了设备和程序的唯一标识,就知道了推送给哪个设备的哪个应用程序.现在又有了一个问题,苹果不知道要推送什么消息内容.这里说明一个概念:消息体(来源:是谁发给我的,比如是:小媳妇.消息内容:比如给我说的是:吃饭了么?),苹果不知道这个消息体,但这个消息QQ知道,我的小媳妇发的这个消息体先到QQ服务器(告诉QQ我要给他发送一条消息),QQ服务器先看看被接受的人(我)在线没有,在线了直接发过去就完了,如果我不在线,这时苹果服务器可以发送,所以要发给苹果服务器,但是发给苹果服务器是有要求的1:交99美元成为开发者才能享受此服务.2:消息体 3目标的DeviceToken,QQ的服务器没有资格保存每一个设备的唯一标识和BundleID,苹果想了一个办法,叫做DeviceToken(APPID(应用位置标识)和UUID(设备唯一标识)).告诉我这三点苹果就可以帮我们做事情,怎么解析DeviceToken苹果知道,所以QQ有一个数据库,一旦有人注册或者是登陆(因为手机和苹果是长连接,一旦登陆或注册之前就会发送设备ID和软件ID,并在苹果服务器获得DeviceToken)QQ数据库就会存用户的信息,比如ID,名字,性别,DeviceToken(假如我的DeviceToken经苹果的加密生成的是ApentLXJ)等等信息,DeviceToken在每次登陆的时候保存,因为用户有可能换手机,一旦换手机用户的UUID就换了,这时需要重新生成一个DeviceToken,然后把最新的Devicetoken保存到服务器中,小媳妇我发消息的时候就去找苹果,看是否符合上面你的三条(交过钱了,有消息体,有目标的DeviceToken:ApentLXJ)),一看都符合就发给我了
补充的:一个手机有多少个应用程序就有多少个DeviceToken,
如果QQ同时推送给多台设备?比如我的QQ手机上登了,IPAD上也登了,这时候取决于QQ服务器的发给苹果的APNS的DeviceToken,发一个就发给一台设备,两个DeviceToken,就发给两台设备.
如果我换了安卓的时候登陆陌陌,这时候就是谷歌来推送通知,谷歌也有一大推服务器来搞.
IOS之推送通知(本地推送和远程推送)的更多相关文章
- 适配 iOS 8 时遇到的问题两则:远程推送和 Unwind Segue
原文:http://imtx.me/archives/1910.html 昨天我在微博上吐槽:iOS 8 / Xcode 6 真是史上对开发人员最糟糕的版本号了.收到非常多朋友表达同感. 之所以这么说 ...
- IOS 远程推送通知(UIRemoteNotification)
● 什么是远程推送通知 ● 顾名思义,就是从远程服务器推送给客户端的通知(需要联网) ● 远程推送服务,又称为APNs(Apple Push Notification Services) ● ...
- IOS-推送通知
一.推送通知 注意:这里说的推送通知跟NSNotification有所区别 NSNotification是抽象的,不可见的 推送通知是可见的(能用肉眼看到) iOS中提供了2种推送通知 本地推送通 ...
- iOS 远程推送通知
1.什么是推送通知 在某些特殊情况下,应用程序被动收到的以不同种界面形式出现的提醒信息 推送通知的作用:可以让不在前台运行的app通知app发生了改变 iOS中得推送通知种类 远程推送通知(Remot ...
- Swift 本地推送通知UILocalNotification
Notification是智能手机应用开发中常用的信息传递机制,它不用消耗更多资源去不停的检查信息状态,可以非常好的节省资源. 在iOS中分为两种通知:本地.远程.本地的UILocalNotifica ...
- iOS的推送机制APNs:本地推送&远程推送
本地推送: 本地推送主要应用在备忘录,闹钟等本地的,基于时间定时的消息提醒.本篇不做详细描述. 远程推送:APNS(苹果推送通知服务) iOS远程推送机制的原理及流程: 注册推送(橙色部分):若该Ap ...
- 81、iOS本地推送与远程推送详解
一.简介 分为本地推送和远程推送2种.可以在应用没打开甚至手机锁屏情况下给用户以提示.它们都需要注册,注册后系统会弹出提示框(如下图)提示用户石否同意,如果同意则正常使用:如果用户不同意则下次打开程序 ...
- iOS推送通知的实现步骤
一.关于推送通知 来源:http://blog.csdn.net/enuola/article/details/8627283 推送通知,也被叫做远程通知,是在iOS 3.0以后被引入的功能.是当程序 ...
- iOS本地推送与远程推送详解
一.简介 分为本地推送和远程推送2种.可以在应用没有打开甚至手机锁屏情况下给用户以提示.它们都需要注册,注册后系统会弹出提示框(如下图)提示用户是否同意,如果同意则正常使用:如果用户不同意则下次打开程 ...
随机推荐
- android studio 使用SVN 锁定文件,防止别人修改(基于Android studio 1.4 )
首先假设开发 A , 和 开发 B , 在使用 SVN 进行项目管理.那么A如何才能 某个锁定文件,防止B修改. 1.第一步,给这个文件加锁 完成这一步,则这个文件就别锁定了. 2.第二步,假如 ...
- iOS设置文字过长时的显示格式
以label为例: //设置文字过长时的显示格式 aLabel.lineBreakMode = UILineBreakModeMiddleTruncation; //截去中间 aLabel.lineB ...
- 【C语言】外部函数和内部函数
目录 [外部函数] [内部函数] 1.外部函数 定义的函数能被本文件和其它文件访问(默认). 注:不允许有同名的外部函数. 2.内部函数 定义的函数只能被本文件访问,其它文件不能访问. 注:允许 ...
- C++语言-09-多任务
概述 概念 计算机同时运行多个程序的能力,多任务处理的方法是:运行第一个程序的一段代码,保存工作环境:再运行第二个程序的一段代码,保存工作环境:--恢复第一个程序的工作环境,执行第一个程序的下一段代码 ...
- GitHub 上有哪些完整的 iOS-App 源码值得参考?
1. Coding iOS 客户端 Coding官方客户端. 笔者强烈推荐的值得学习的完整APP.GitHub - Coding/Coding-iOS: Coding iOS 客户端源代码 2. OS ...
- (视频) 《快速创建网站》 2.3 WordPress初始化和功能简介
本文是<快速创建网站>系列的第4篇,如果你还没有看过之前的内容,建议你点击以下目录中的章节先阅读其他内容再回到本文. 访问本系列目录,请点击:http://devopshub.cn/tag ...
- mysql锁机制总结
1.隔离级别 (1)读不提交(Read Uncommited,RU) 这种隔离级别下,事务间完全不隔离,会产生脏读,可以读取未提交的记录,实际情况下不会使用. (2)读提交(Read commited ...
- Kafka 技术文档
Kafka 技术文档 目录 1 Kafka创建背景 2 Kafka简介 3 Kafka好处 3.1 解耦 3.2 冗余 3.3 扩展性 3.4 灵活性 & 峰值处理能力 3.5 可恢复性 ...
- html5+css3实现跑动的爱心/动态水滴效果[原创][5+3时代]
大风起兮云飞扬,安得猛士兮走四方!html5+css3,不学不行. 做web开发已经有好几年了,见证了太多语言的崛起和陨落. 其实作为一个程序员最苦逼的事情莫过于每天要不停的追赶各大公司新出的框架和语 ...
- Android之drawable state各个属性详解
android:drawable 放一个drawable资源android:state_pressed 是否按下,如一个按钮触摸或者点击.android:state_focused 是否取得焦点,比如 ...