iOS 本地和远程通知(一)

本地通知和远程通知是用户通知(user notification)的两种类型,它们不同于广播通知(由NSNotificationCenter类管理)和键值观察通知(key - value obverse )。即使app没有在前台运行,用户通知也能让用户知道有关于他们的新消息。该信息可以是消息,或者是即将发生的日程表事件,或者是远程服务器上新的数据。当操作系统呈现用户通知时,无论是来自本地的还是远程的通知,它们的展现形式都是一样的。他们可以显示警告信息,也可以在应用图标上显示badge,或者同时播放声音。

当收到用户通知时,用户可以点击它来启动相关的应用程序,查看详细信息。他们也可以选择忽略该通知,在这种情况下,该应用不会被激活。

本地和远程通知的根本目的是使应用程序不在前台运行时也能提醒用户有关于他们的新消息。例如--一封新邮件或即将到来的约会。本地通知和远程通知的本质区别很简单︰

  • 本地通知由一个应用程序在同一个设备上生成和传递。
  • 远程通知,也被称为推送通知,由你的服务器发送到苹果推送通知服务(Apple Push Notification service),然后由APNS向设备推送通知。

本地和远程通知对用户的表现形式是一样的

用户可以通过下面的几种方式得到通知:

  • 屏幕上的alertbanner
  • 应用程序的图标的badge
  • 伴随alertbannerbadge的声音

从用户的角度看本地和远程的通知表明在应用程序里面有用户感兴趣的东西。

例如,有一个管理待办事项应用程序,在列表中的每个项目都有一个必须完成的项目的日期和时间。用户可以要求应用程序在该日期到来前的一个特定的时间间通知它。要实现此行为,应用程序生成一个关于这个日期和时间的本地通知。该应用选择指定一个badge(1)和播放一个声音,而不是显示一个alert。届时,iOS设备播放的声音,在应用程序的图标的右上角显示一个1。如下图:

用户听到的声音和看到badge,并启动应用程序,查看待办事项。用户指定设备上的哪些app可以发送通知,他们也可以对某些app启用或者禁用某些通知类型(即alert,badge,sound)。

本地和远程通知对于app来说是不一样的

当你的应用程序是在前台运行时,UIKit直接把本地和远程通知传递到应用程序的委托对象,而不显示任何系统UI。对于收到的本地通知, UIKit调用application:didReceiveLocalNotification:方法,而对于远程通知则调用application:didReceiveRemoteNotification:fetchCompletionHandler:方法。使用提供的通知字典来更新你的应用。因为你的应用程序正在运行,你可以悄悄的更新你的用户界面,让用户知道有新的信息。

当你的应用程序必须启动以接收通知,UIKit将包括UIApplicationLaunchOptionsLocalNotificationKeyUIApplicationLaunchOptionsRemoteNotificationKey的键的词典传递给你的应用程序委托的application:willFinishLaunchingWithOptions:application:didFinishLaunchingWithOptions:方法。这些键的存在可以让你知道有通知数据等待被处理,并给你一个机会,以适当地配置你的应用程序的界面。你不需要在这些方法中处理通知。在你的应用程序运行后,UIKit调用你的应用程序委托的其他方法,如application:didReceiveLocalNotification方法,来让你处理通知数据。哪个方法被调用取决于你的实现和用户与系统UI的交互。

当你的应用程序正在运行,但不是最前端,UIKit显示系统UI,然后传递结果到后台运行的app。和正在运行的app类似,UIKit调用相关的方法来处理通知。如果无法在后台交付通知数据,UIKit的等待你的应用程序下一次运行的时候再传递通知数据。

本地通知

本地通知非常适合应用与基于时间的行为,如日历和待办事项列表的应用程序。在后台长时间运行的程序而被iOS系统限制的app可能会发现本地通知也有用。例如,依赖于服务器消息或数据的应用程序可以轮询服务器传人的新消息当app在后台运行时;如果有新消息或更新可以下载,它们就可以处理需要的数据,并在适当的时候通知用户。

本地通知是UILocalNotification或NSUserNotification的实列并有三种不用类型的属性:

  • Scheduled time
    您必须指定操作系统传递通知的日期和时间;这个被称为fire date。可以限定fire date 的时区,这样当用户旅行时系统可以调整触发时间。你也可以要求系统以一个固定的间隔(周,月,等待)来触发通知。
  • Notification type
    这些属性包括警报消息,默认的动作按钮的标题,应用程序图标badge数量,要播放的声音,以及1iOS8和更高版本的自定义动作的类别。
  • Custom data
    本地通知包含的用户信息字典的自定义数据。

设备上的每个应用程序被限制为最多64个本地通知。系统会丢弃超过此限制的通知,只保留最近要触发的64个通知。重复通知被视为一个单个的通知。

远程通知

iOS或Mac应用程序通常是基于客户端/服务器模式的较大的应用程序的一部分。该应用程序的客户端安装在设备或计算机上;该应用的服务器侧具有向它的客户端应用提供数据的主要功能,并且因此被称为提供者(Provider)。客户端应用程序会定期与服务器连接并下载正在等待它的任何数据。电子邮件和社交网络应用程序是该客户端/服务器模型的例子。

但是,如果应用程序没有连接到提供者,甚至当应用程序正在在设备或计算机上运行时,提供者有新的数据等它下载?它是如何知道这个等待数据?远程通知是解决这一困境的方法。远程通知是一个提供者传递给设备的操作系统的短消息;操作系统可以通知客户端的应用程序,有数据要下载,有新的消息要浏览,等等。如果用户启用该功能(在iOS)并且该应用正确注册,通知被传递到操作系统和应用程式。苹果推送通知服务(APNs)是远程通知功能的主要技术。

远程通知服务和桌面系统上的后台应用程序目的差不多,但没有额外的开销。通知会在当前没有运行,或者在iOS中的情况下,没有运行在前台的应用中发生。操作系统代表应用程序接收远程通知,并提醒用户。然后,如果用户启动应用程序,它会下载服务器提供的数据。如果在应用程序正在运行时通知被传递到app,应用程序可以选择直接处理通知。

正如它的名字所暗示的,苹果推送通知服务使用一个远程的设计以传递远程通知到设备和计算机。推式设计(push design)不同于它的反面拉式的设计(pull design),该通知的收件人被动侦听更新,而不是积极地轮询。APNs使用持久IP连接来实现远程通知。

大多数远程通知包含一个payload:一个JSON字典包含已经定义好的如何通知用户的APNs属性。payload越小,通知的性能越好。虽然你可以定义自定义属性,但是不要用远程通知机制来传输数据。远程通知是尽最大努力交付,这具有很高的成功率,但不能保证每次都成功。

当一台设备不在线时,APNs保留上次从该设备上的应用程序的提供者收到的通知。如果该设备上线(联网),APNs会把存储的通知推送到设备。运行iOS的设备接收通过Wi-Fi和蜂窝连接的远程通知;一台运行OS X通过Wi-Fi和以太网连接,接收远程通知。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,198评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,663评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,985评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,673评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,994评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,399评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,717评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,407评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,112评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,371评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,891评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,255评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,881评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,010评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,764评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,412评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,299评论 2 260

推荐阅读更多精彩内容