前言
iOS消息推送分两种,本地推送和远程推送。本地推送是由本地应用触发的,是基于时间的通知形式,不通过网络,直接安装应用后就可以接到通知,一般用于闹钟定时、待办事项等提醒功能。远程推送是需要网络,服务端通过苹果消息推送服务器APNS实现推送,无论APP处于前台、后台或者被kill的情况下仍能收到消息通知,如新闻推送、聊天消息接收等。
本文要讲的是后者远程消息推送。主要从iOS远程消息推送过程以及客户端如何处理推送消息的开发实现逻辑两方面来展开,最后梳理一下iOS消息推送测试时需要关注的点。
1.iOS消息推送过程
如上是iOS消息推送的详细流程图,主要分为几个过程:
(1)App启动过程中,使用UIApplication::registerForRemoteNotificationTypes函数与苹果的APNS(Apple Push Notification Service,苹果消息推送服务器)通信,发出注册远程推送的申请。
(2)若注册成功,APNs 会返回一个设备的标识符即 DeviceToken 给 App,回调函数application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken 会被触发,App可以得到deviceToken。
(3)App获取到DeviceToken后,将DeviceToken发送给自己的服务端。
(4)服务端拿到DeviceToken以后,当有消息要推送时,服务端使用证书文件,向苹果的APNS服务器发起一个SSL连接。连接成功之后,发送一段JSON串,该JSON串包含推送消息的类型及内容。
(5)苹果的APNS服务器得到推送消息(JSON串)以后,向App发送通知消息,使得App的回调函数application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary *)userInfo被调用,App从userInfo中即可得到推送消息的内容。
2.客户端处理推送消息
客户端APP收到以上服务端推送的消息后,对推送消息的处理分两种情况:
(1)当APP处于前台时,系统收到推送消息,此时系统不会弹出消息提示,会直接触发application:(UIApplication *)applicationdidReceiveRemoteNotification:(NSDictionary *)userInfo函数,推送数据在userInfo字典中。APP端不会展示消息横幅。
(2)当App处于后台时,且开启了 Remote Notification,如果系统收到推送消息,当用户点击推送消息时,会执行application:(UIApplication *)applicationdidReceiveRemoteNotification:(NSDictionary *)userInfo函数,
此时AppDelegate中函数执行的顺序为:
applicationWillEnterForeground
application:didReceiveRemoteNotification
applicationDidBecomeActiveI
APP端展示消息横幅、通知中心、声音、角标。
(3)在App没有运行(APP退出)的情况下,系统收到推送消息,用户点击推送消息,启动App。此时,不会执行前面提到的 didReceiveRemoteNotification函数,而是在App的applicationDidFinishLaunching函数中处理推送,通过以下代码可以获取推送消息中的数据: NSDictionary *userInfo=[launchOptionsobjectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
APP端展示消息横幅、通知中心、声音、角标。
3.推送相关知识点介绍
3.1 证书文件
要想完整实现一条消息的推送,需要生成一些证书文件,并进行设置。证书主要有以下几种:
(1)certSigningRequest文件,该文件在MAC系统中生成,用于在Apple网站上申请推送证书文件。
(2)注册一个支持push的app id,后面会用到。
(3)推送证书cer文件,该文件在developer.apple.com中生成,用于生成服务端需要的文件。
(4)生成服务端使用的证书文件。如果是使用网上的mac 版PushMeBaby工具,在mac机器上进行推送消息的发送,那么有上面的cer文件就够了。如果是使用PHP、java/c#开发自己的服务端,那么还需要将上面的cer文件做一个转换,生成pem文件或者p12文件。
(5)生成XCODE使用的provisioning文件,该文件用于真机调试。
注:证书的生成过程可以自行Google。
3.2 Payload
Payload 是通知的一部分,每一条推送通知都包含一个 Payload。它包含了系统提醒用户通知到达的方式,还可以添加自定义的数据。即通知主要传递的数据为Payload。
Payload 本身为 JSON 格式的字符串,它内部必须要包含一个键为 aps 的字典。aps 中可以包含以下字段中的一个或多个:
Alert:其内容可以为字符串或者字典,如果是字符串,那么将会在通知中显示这条内容。
badge:其值为数字,表示当通知到达设备时,应用的角标变为多少。如果没有使用这个字段,那么应用的角标将不会改变。设置为 0 时,会清除应用的角标。
sound:指定通知展现时伴随的提醒音文件名。如果找不到指定的文件或者值为 default,那么默认的系统音将会被使用。如果为空,那么将没有声音。
content-available:此字段为 iOS 7 silent remote notification 使用。不使用此功能时无需包含此字段。
如果需要添加自定义的字段,就让服务器端跟aps同一层级添加一个数组(以Json为例),如下图所示:
这样收到的 Payload 里面会多出相应添加的字段。
4.消息推送功能测试
了解了消息的开发实现流程后,小编总结了消息推送测试时需要关注的点,希望对你有所启发:
(1)消息推送对象
消息推送一般可以自定义推送对象,有全部推送,精确推送,及安卓和IOS渠道推送,注意推送对象是否正确,推送之前确认自己是否在测试环境操作,以免造成生产问题。
(2)消息内容
消息简介:客户端收到消息推送有两种形式,客户端后台运行或退出时一般推送显示在通知栏,客户端前台运行一般弹出弹框或不显示,简介内容注意字数过多溢出情况。具体推送形式要符合消息形式配置。
消息详情:注意详情所支持的内容,包括文字、图片、表情包、换行以及链接跳转。
(3)消息推送场景(支持定时推送)
消息推送时间:a)设置过去时;b)未推送之前修改消息内容;c)删除消息,查看是否还会推送。
(4)客户端不同运行状态收到推送:a)前台运行;b)后台运行;c)进程关闭状态。
(5)客户端消息展示:角标(收到推送计数+1、打开推送后角标消失)、声音、内容、弹窗、文案。
(6)客户端操作:推送正常到达;点击推送响应;不同界面打开推送跳转界面及功能是否正常。
(7)系统兼容: iOS10系统前后推送机制有较大更新,检查系统兼容性。
(8)重装APP是否会收到多条推送等异常。
(9)切换账号后,是否出现收到旧账号的推送。
(10)多端同时在线的APP,是否都能正常收到推送。
(11)特殊场景:a)多个提醒冲突;b)当天设置当天推送;c)当天设置隔几天起效。