设为首页 加入收藏

TOP

iOS Push详述,了解一下?(一)
2019-08-31 01:05:16 】 浏览:147
Tags:iOS Push 详述 了解

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~

本文由WeTest质量开放平台团队发表于云+社区专栏

作者:陈裕发, 腾讯系统测试工程师

商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处。

原文链接:http://wetest.qq.com/lab/view/380.html

WeTest 导读


本文主要对iOS Push的在线push、本地push及离线(远程)push进行梳理,介绍了相关逻辑,测试时要注意的要点以及相关工具。小小的Push背后蕴藏着大大的逻辑!


Push种类

一、在线push


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

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

img1.png

              Qzone在线push 

二、离线(远程)push


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

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

img2.png

   离线push 

1、静默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)状态下运行一段代码,可用于从服务器获取内容更新。

三、本地push


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

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

img3.png

         本地push

img4.png

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

本地push实现

一、 iOS10以前本地push弹出方式


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

1、立即展示( iOS10以前)

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

img5.png

2、延迟展示( iOS10以前)

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

img6.png

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

img7.png

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


img8.png

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

img9.png

     本地push效果

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

img10.png

      消息数

三、处理本地push ( iOS10以前)


1、 App没有启动情况下处理本地push

这种情况下,当点击通知时,会启动App,而在App中,开发人员可以通过实现AppDelegate中的方法:- (BOOL)application:(UIApplication)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions,然后从lauchOptions中获取App启动的原因,若是因为本地通知,则可以App启动时对App做对应的操作,比方说跳转到某个画面等等。

img11.png

2、App运行在后台及前台

上面的2种情况的处理基本一致, 不同点只有当运行再后台的时候,会有弹窗提示用户另外一个App有通知,对于本地通知单的处理都是通过AppDelegate的方法:- (void)application:(UIApplication )application didReceiveLocalNotification:(UILocalNotification *)notification来处理的。

img12.png

四、iOS10以后本地push弹出方式


iOS10以后,本地通知可以由使用 UNUserNotificationCenter来管理。

创建方法:

img13.png

接下来需要需创建一个包含待通知内容的 UNMutableNotificationContent 对象:

img14.png

在iOS上可以通过以下几种触发器来触发本地push:

● UNCalendarNotificationTrigger 传送本地通知的日期和时间。

● UNTimeIntervalNotificationTrigger 传递本地通知之前必须过期的时间。

● UNLocationNotificationTrigger 用户必须达到的地理位置才能提供本地通知。

● UNPushNotificationTrigger 表示通知是从Apple推送通知服务发送的对象。

假如以时间间隔(TimeInterval)来触发,则设置触发器代码为:

img15.png

推送本地push的代码为:

img16.png

在线、离线(远程)push流程

一、在线push流程


在线push相对简单,因为是内部实现,具体流程如上面所示。

1、判断app是否在线

此处可以根据APP自身的后台策略如上一次与后台交互的时间等方法来判断A

首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇iOS面试题 下一篇【OC底层】OC对象本质,如 isa, su..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目