设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 技术文摘 查看内容

由浅入深,程序媛带你玩转 iOS10推送

2016-10-27 21:45| 发布者: joejoe0332| 查看: 781| 评论: 0|原作者: oschina|来自: oschina

摘要: 推送是现在开发运用必备的功能,许多我们安装在手机上使用频率很高的应用,要是过了几天没使用,就可能被我们遗忘,这个时候就需要推送功能来提醒我们此应用的存在。其最初目的可能是为了提升用户的体验,而最终目的 ...

施文婷,极光推送华西地区技术支持负责,四年以上开发经验,自学iOS开发,熟悉Java后端开发的流程和技术面,了解html/css和js。

推送是现在开发运用必备的功能,许多我们安装在手机上使用频率很高的应用,要是过了几天没使用,就可能被我们遗忘,这个时候就需要推送功能来提醒我们此应用的存在。其最初目的可能是为了提升用户的体验,而最终目的是为了提高应用活跃度和用户留存率。

一、推送和通知的区别

官方所说的通知和推送是两种不同的概念。推送只是远程通知的触发方式,而通知是操作层面的一种UI展示方式,所以推送不等同于通知。

二、通知的分类

在IOS当中,官方将通知分为两大类,本地通知和远程通知。

1. 本地通知

本地通知是由本地定制好通知以后,添加到应用的Schedule里面,在一定条件下可触发通知,其触发方式有三种,Time Interval,Calender和Location,后两者是IOS10新增的触发方式。Time Interval,是下一步操作通知,如,在日常生活中当某项功能操作完成后,提醒用户下一步应做事项。Calender(日历),是养成类操作通知,如,设置每周六的12点提醒用户该做的事项;Location(地理围栏),是基于地理位置的相关通知,如,当用户离开“家”这一地理范围的时候,会收到关水电煤气提醒。

2. 远程通知

远程通知是由应用的服务端向APNs(苹果推送服务器)发送一个Notification Payload,然后APNs再将通知下发到指定应用上面,其触发方式是push,即推送。远程通知有两个分类,User-facing和Silent Update。User-facing是用户可以直接看到以及感受到的推送,如,手机在锁屏状态下收到通知会有通知横幅的展示。Silent update是静默推送,应用服务器在发送Notification Payload的时候添加”{content -available:1}“即可,它可以让应用在后台状态下运行一段代码,我们可以通过这一段代码,从服务器获取内容来进行更新(注意:静默推送的有时间和频率的限制)。

三、IOS 10 通知新特性

我们日常用到的通知都比较简单。不管是本地通知还是远程通知,都是在发起之后被推送到客户端显示,其内容是在发送时就已确定好,后期不能做修改。并且,推送的内容只能是文本。如果我们想要推送的内容或形式更加丰富,更加个性化,这在现有基础上扩展起来会非常困难,会使本身就复杂的API显得更加让人难以理解。所以IOS10新增了用户通知框架 NotificationsUI,它允许我们在接收通知、显示通知之前,对通知内容进行修改,即我们可以自定义我们通知的内容。

上图IOS 10收到通知时的展示情况。如图,最上方是Title(标题),中间是Subtitle(副标题),最后是body(正文),窗口右下角的小图标展示了通知详情。下图是自定义通知的UI的展示,和刚刚通知展示不一样的是,我们将通知的内容进行了重新排版,除了对字体大小的修改,还在下方添加了回帖和点赞的按钮。

四、IOS 10 通知流程

IOS 10通知的流程主要分为三步:第一,申请相关的权限,注册通知;第二,创建和发起通知;第三,客户端收到通知后的展示和处理。

1. 获取用户权限

一般我们获取的用户权限包括Visual Alert(展示)、Sound(声音)、Vibration(震动),及App Icon Badging(应用图标上面的未读消息提示)。这些可以通过调用API实现,它是IOS 10提供的Notifications框架,所以,在使用之前,必须先引入Notifications框架:

当调用API获取用户权限后,会弹出一个是否接受通知的窗口,一旦用户拒绝了这个请求,下次调用API的时候就不会再有弹出框的提示。所以应该要在合适的地方调用此权限,并提前告知获取权限的目的,减少用户拒绝率。

获取用户设置信息是新增的API,即提示用户可以在设置里为应用打开通知。如果用户同意了可以发送通知,本地通知就可进行推送:

2. 创建和发起通知

相比本地通知,远程通知还需要有额外的步骤。第一步是注册远程通知:

在注册远程之后,我们需要获取DeviceToken。我们在这里看到的DeviceToken是一个data类型,为了方便使用和传递,一般,我们会将它转换成字符串,然后上传到服务端,然后服务端再将其发送到Payload,APNs下放给我们的应用便可收到通知:

简单说下远程通知的Payload:

在IOS 10以前,alert是一个字符串,在IOS 10中它是一个字点类型,可以包含很多其他的内容,如Title,Subtitle,Body等。上图只是一个简单的Payload,如果你还想要其他的内容,也可以进行扩展。

3. 通知的展示和处理

下图是客户端收到的效果:

用户收到通知之后点击通知,或者将通知清除,都统一归为action。用户对action的操作情况有三种:第一种是Default Action,是用户收到通知后打开应用的操作;第二种是Actionable Notification,给通知添加回帖和点赞按钮;第三种是Dismiss Action,清除通知的操作。

4. 回帖和点赞功能实现

现在,我来详细介绍下回帖和点赞。首先,我们要注册两个action,一个是回帖,一个是点赞。回帖,我们将它的类型定义为UNtextInput,而点赞是普通类型的action。接下来我们要把两个action添加到ID为news的Category里面,最后把Category注册到用户通知中心,这些是客户端要做的。那么,在应用向服务器发送title的时候,我们将Category和news加上。最后显示在我们通知的有,回帖和点赞两个按钮。

当然,我们前面还说到了一个Dismiss Action,它和Category的区别只在于一点:Category有一个参数叫option,这里我们设置的为null,如果你想定义成Dismiss Action,就是从用户中心清除这个按钮,在此传入的option参数为dismiss即可。

接下来看一下用户点击的action的处理,如图所示,我们只是简单的举例,对回帖的action进行处理,简单地获取了回帖输入框的内容:

五、给通知添加图片和自定义UI

给通知添加图片和自定义UI的操作需要用到IOS 10通知新增的Extension,它们分别是Service Extension和Content Extension。

1. 使用Service Extension 给通知添加图片

Service Extension允许通知到达客户端显示之前,对通知内容进行处理。以前的内容在发起时是唯一确定的,我们想在传输过程中加密,到达客户端之后又解密是做不到的。但是在IOS 10用Service Extension可以做到端和端的加密和添加Media Attachments,它包括我们过程看到的图片,音频,视频,也支持JS。

下面我们来详细了解Service Extension,首先我们要创建target,接下来xcode会自动创建三个文件:NotificationService.h,NotificationService.m和Info.plist。

我们来看下如何为通知添加图片。首先,在Payload里面要添加上“mutable-content”,它的参数值为1。然后是Attachment(图片)和URL,Attachment的值可以由自己定义,URL可以来自HTTP也可以来自本地。如果图片是存在服务器端,那么服务器端也会有个对应ID,值也可以传图片的ID,只要是能找到图片的值即可。

接下来是对图片的处理。首先,我们将图片下载到本地,这个下载有时间和大小的限制,图片限制为10M,音频视频的限制为50M。所以在传送之前,如果文件过大,要提前进行压缩,以防止超过了时间还没有传入正确的内容。然后,我们要将下载到本地的图片添加到Media Attachment里面,再将其添加到通知的Content里,需要注意的是,Attachment是系统开辟的独立空间,用以管理文件,如删除文件。

最终的展示效果:

2. 使用Content Extension 自定义通知UI

Content Extension主要用来自定义通知UI。和Surface Extension一样,我们要创建一个content extension target,然后xcode会自动生成四个文件:NotificationViewController.h,NotificationViewController.m,MainInterface.storyboard和Info.plist。

我们来看下如何自定义UI。首先,我自定义了Title,Subtitle,Body和自定义图片的显示,因为Attachment在系统里有一个独立的空间,所以我们在Content Extension里面使用Attachment的时候,要先通过下面starting这个方法来告诉系统我们要使用的Attachment,然后我们可以获取到attachment里面的数据,接着我们需要将图片数据添加到自定义的Image View里面,最后我们在使用完Attachment之后,要调用一个stop的方法来告诉系统我们已经使用完毕Attachment。

在Content Extension里面也有一个Category,它是一个自创类型。我们必须依赖Category添加action来进行交互。在这里看到的Category是一个字符串,它也可以是一个数组,多个Category可以共用一套UI,但这些Category是独立的,它可响应不同的action。

接下来是为Payload指定Category,下图是最终的展示效果:上面是header,包括应用的图标还有应用的名称,最中间是自定义的UI形式,接下来是默认的通知在UI中的显示,最后是我们刚刚自定义的回帖和点赞两个action(因为自定义设置界面的关系,它的长度超出了屏幕之外,导致点赞这个action看不到)。

既然我们已经自定义了内容的显示,就不需要默认content的显示。因此,需要在Info.plist文件里面添加一个DefaultContentHidden, 设置为yes,这样就可以去掉默认的content显示,只显示自定义的UI。

显示完之后需要对回帖和点赞进行处理,这个处理包括两种方式,一种是通过用户通知中心的代理来实现,另一种是在Content Extension里面,通过更新自定义的界面进行处理。

上图代码是我们对action的处理,需要提醒大家的是,这是option的方法,你可以使用也可以不声明,但是,一旦声明了就要所有option进行处理,而不是只处理其中的一个。另外,因为此通知的ViewController是普通类型的Controller,我们就可以定义它的尺寸大小,包括可以使用约束来自动布局等等。


酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部