微信7.0“强提醒”功能引关注,趁热聊聊Push推送技术应用

12月21日,微信7.0正式问世,这是微信问世以来一次最大的从视觉到功能上的改变。而引发友圈热议的有趣的一项功能就是“强提醒”。

图片来源:新科客公众号


强提醒是产品设计、交互上的小创新,趁着当前热点,道乐也来分享下收集到的背后离线推送技术有关的推送技术使用浅谈。(由于时间比较紧迫,先分享对推送功能说明,后续我们也会对微信7.0功能会有更进一步技术应用与基金场景分享)


本文一方面讲述了iOS推送的三大类型及其特性、技术实现方式;另一方面,提供产品设计中面临多种消息推送场景,技术的选择如何更适用于用户体验的思考



1

前言:3种iOS系统中的Push推送


1、在线Push

简单来说,就是QQ、微信等IM界面处于前台时,消息会直接通过IM自建的网络长连接通道推送过来,这种Push需要长时间保持网络连接状态才能收到的推送。


2、离线(远程)Push

使用的苹果提供的一套服务APNs,它使得APP处于后台或者被kill的情况下仍能收到对应的消息推送,这种就是基本每个APP都有的烂大街的推送了。


3、本地Push

是由本地应用触发的,不涉及任何网络数据请求,只需要添加好触发器即可在触发指定条件时发送推送,使用最多的场景是闹钟的定时提醒等。



2

iOS的Push种类

1 在线Push

当用户在线(APP在前台,处于唤醒状态)时,收到的状态栏或者大部分的消息提示,称为在线Push。这种功能与苹果系统无关,只是我们自己APP开发的一种功能,所以这种Push也就无法通过设置中的“通知”开关来控制。


当APP在前台时,自己发的说说被点赞了,那么收到的在线Push如下:

(以iOS Qzone为例)


2 离线(远程)Push

当APP在离线(kill掉进程、切到后台、锁屏)时,收到的消息提醒,称为离线push。实际上我们的设备联网时(无论是蜂窝联网还是Wi-Fi联网)都会与苹果的APNs服务器建立一个长连接,那么一旦有一条通知推送的时候,这条通知需要先经过苹果的APNs服务器后才可以推动到某台设备的某个APP上。这种Push也与设置中是否打开“通知”有关。


当APP在后台、锁屏或者被kill了应用时,收到了消息:

(以手机QQ为例)


3 本地Push

本地推送跟离线推送的功能是基本一样的,都是要提醒用户去做某些事情。不同在于本地推送是不需要设备联网的,而离线推送是必需要设备联网的,因为只有联网状态下,才能和苹果的APNs服务器建立场链接,从而推送消息。本地推送是由APP自己设定的,只会发送给安装此APP的这台设备,属于一对一的对应关系。这种Push跟离线Push一样与设置中是否打开”通知“有关。


这里可以直接在手机设置一个计时器,一旦计时器到了就会弹出本地Push:




3

Push实现

1 在线Push实现

由于是内部实现,流程上不需要太复杂。


1) 判断app是否在线:  

此处可以根据APP自身的后台策略,如上一次与后台交互的时间等方法来判断APP是否在线或者离线。如果认为在线,则发送在线Push,否则可以发送离线Push。


2) 在线Push的几个特点:

•    不需要经过苹果APNs;

•    需要自己实现转场链接;

•    代码在app内部


2 离线Push实现

下面这张图把离线Push的过程大致描述勾画了一遍,在此解析一下下图。

(离线Push的过程)

1)首先是应用程序注册消息推送。

2)iOS跟APNs Server要deviceToken。应用程序接受deviceToken。

3)应用程序将deviceToken发送给Push服务端程序。

4)服务端程序向APNs服务发送消息。

5)APNs服务将消息发送给iPhone应用程序。

Tips

deviceToken:是APNs用于区分识别每个iOS设备和设备上不同app的一个标识符,还可以用于APNs通过它将推送消息路由到指定设备上

注意点通过查资料得知,iOS8及之前的iOS系统,对于同一部手机,如果卸载后重装APP的话,deviceToken是不会变的,在token变了之后,老的token,就被认为无效了,苹果不会对这部分无效的token推送。但是,iOS9及以后的iOS系统,对于同一部手机,卸载后中装APP的deviceToken是会发生变化的,而且老的token不会无效,还可以正常推送,这应该是苹果的一个bug,但是苹果也没有修复这个问题,所以这个需要开发者自己来解决,否则容易出现一个app收到多个push的问题。


iOS关于Push的一些新特性:

iOS10中将之前繁杂的推送通知统一成UserNotifications.framework来集中管理和使用通知功能,还增加一些使用的功能——撤回单条通知、更新已展示通知、中途修改通知内容、再通知中显示多媒体资源、自定义UI等功能,功能着实强大!


iOS10以前的Push只有文字,甚至没有标题。iOS10以后的Push更加多样化,可以有主标题,副标题,甚至还有附件。这里以腾讯新闻为例(有标题,内容,和附件):

3D touch点入详情以后

(以腾讯新闻为例(有标题,内容和附件))

这里我们惊奇的发现,除了可以携带图片这样的附件、Push还能展开详情以外,进入详情以后,下面还多了“打开”、“收藏”、“不感兴趣“这些选项,那么这种场景便可以结合起来用于收集用户对哪些消息比较感兴趣,也便于后续运营


3 本地Push实现

1)APP本地创建通知,加入到系统的Schedule里

2)如果触发器条件达成时会推送相应的消息内容


基本的本地推送主要流程:

1)创建一个触发器(trigger)

2)创建推送的内容(UNMutableNotificationContent)

3)创建推送请求(UNNotificationRequest)

4)推送请求添加到推送管理中心(UNUserNotificationCenter)中


那么本地推送有什么特性呢?(除了不需要联网外)


触发器trigger有三种类型


1)UNTimeIntervalNotificationTrigger:定时推送,即一段时间后会触发。

2)UNCalenderNotificationTrigger:定期推送,进行注册之后,将在注册的时间点触发。

3)UNLocationNotificationTrigger:定点推送,在进入地区、从地区出来或者两者都要的时候进行通知。


可以发现本地Push存在定时、定期、定点三种特性的推送,那么是否能用于购买基金的时候,比如某个用户突然对某个基金感兴趣了,但是却没决定购买的时候,此时如果有个定期15点推送,可激发客户潜在的购买欲望。又或者当不小心走到某个地点的时候,给用户来个推送介绍下当地的风景特色之类的。



4

总结

这次讲述了那么多推送的东西,主要是为了科普下iOS推送的各种类型以及特性,能够知道多种消息推送的方法,而不至于仅限于其中一种。至于为什么没有太多高大上的专业知识?其中一些深入的推送相关知识普遍性不是太高,又或者代码层面可以通过参考苹果的官网文档了解,所以也没有提到,例如:自定义通知声音、可操作通知类型等。当然如果你对这些知识很感兴趣,那么后期也会继续分享进阶的推送功能。