了解iOS消息推送一文就够史上最全iOSPush技术详解

动态 未结 置顶 精帖
用户
悬赏:60飞吻

了解iOS消息推送一文就够(史上最全iOS Push技术详解)

1、引言

开发iOS系统中的Push推送,通常有以下3种情况:

  • 1)在线Push:比如QQ、微信等IM界面处于前台时,聊天消息和指令都会通过IM自建的网络长连接通道推送过来,这种Push在本文中暂且称为“在线Push”;
  • 2)本地Push:这种就是最常见的iOS系统通知(作用相当于传统PC端的提示窗口,在iOS10以后全部整合到UserNotifications.framework框架了),不涉及任何网络数据,仅仅是让APP拥有一个统一系统通知方式而已,比如:闹钟的定时提醒等;
  • 3)离线/远程Push:这就是iOS程序员最熟悉的APNs这一套东西了,它使得APP处于后台或者被kill的情况下仍能收到网络通知,最常见的应场景就是IM聊天工具了。

本文将对iOS Push的在线push、本地push及离线(远程)push进行了详细梳理,介绍相关逻辑、测试时要注意的要点以及相关工具的使用。小小的Push背后蕴藏着大大的逻辑,我们一起来学习吧!(本文同步发布于:http://www.52im.net/thread-1762-1-1.html)

2、相关文章

《移动端实时消息推送技术浅析》

《iOS的推送服务APNs详解:设计思路、技术原理及缺陷等》

《信鸽团队原创:一起走过 iOS10 上消息推送(APNS)的坑》

《扫盲贴:浅谈iOS和Android后台实时消息推送的原理和区别》

3、iOS的Push种类

3.1在线push

在线push:当用户在线(APP在前台)时,收到的状态栏的消息提醒,称为在线push。这个功能与苹果系统无关,是我们自己的APP开发的一种功能,该push与设置中是否打开“通知”无关。

这里以iOS Qzone为例,当APP在前台时,自己发的说说被点赞了,收到的在线push如下:

3.2离线/远程push

离线push:当APP在离线(kill掉进程、切到后台、锁屏)时,收到的消息提醒,称为离线push。离线push是需要经过苹果的APNs服务器才可以推送到某台设备的某个APP上的,这是和本地push的本质区别。push与设置中是否打开“通知”有关。

这里最简单的以大家常用的手机QQ为例,当APP在后台、锁屏或者被kiil了进程时,收到了消息:

一种特殊的远程push:静默push

严格来说,静默push属于远程push的一种特殊情况,静默push用的场景不较少,这里只做简要介绍。

首先我们看看离线(远程)push与静默push的区别:

【普通离线(远程)push】:收到推送后(有文字有声音),点开通知,进入APP后,才执行– (void)application:(UIApplication didReceiveRemoteNotification:(NSDictionary fetchCompletionHandler:(void result))handler *)application *)userInfo (^)(UIBackgroundFetchResult

【静默push】:收到推送(没有文字没有声音),不用点开通知,不用打开APP,就能执行(void)application:(UIApplication )application)userInfo didReceiveRemoteNotification:(NSDictionary fetchCompletionHandler:(void (^)(UIBackgroundFetchResultresult))handler,用户完全感觉不到。

所以静默push又被我们称做 Background Remote Notification(后台远程推送)。静默推送是在iOS7之后推出的一种推送方式。它与其他推送的区别在于允许应用收到通知后在后台(background)状态下运行一段代码,可用于从服务器获取内容更新。

3.3本地push

本地push:本地推送和远程推送的功能是一样的,都是要提醒用户去做某些事情。但是和远程推送不同的就是本地推送是不需要设备联网的,而远程推送是必需要设备联网的,因为只有联网状态下,才能和苹果的APNs服务器建立长连接,从而推送消息。本地推送是由App自己设定的,并且发送给安装此App的这台设备,属于一对一的对应关系。比较典型的应用是闹钟类似的场景。该push与设置中是否打开“通知”有关。

最容易看到本地push的场景,可以直接在手机设置一个计时器,计时器时间到了就会弹出本地push:

由于本地push原理和作用相对于在线push和离线push都更为简单明了,下文主要介绍在线push和离线push。

4、本地push实现

4.1iOS10以前本地push弹出方式

试验过iOS10以前的本地push方法在iOS10+的系统也能使用,不过可能有些参数不生效。

1)立即展示( iOS10以前)

本地push稍微简单,有两种方式可以调用,一种是presentLocalNotificationNow方法,立即展示本地push:

2)延迟展示( iOS10以前)

另一种是用scheduleLocalNotification方法按计划来弹本地推送:

如果使用这种方法,需要对推送的时间进行设置,举个例子,设为5秒后:

4.2设置本地push内容( iOS10以前)

其中alertBody是消息内容锁屏与不锁屏时效果如下:

applicationIconBadgeNumber是消息数量,我们可以看到这里设置

回帖
  • 消灭零回复
[打开调试信息]