ios那些事儿

AppExtension:NotificationService

2021-04-20  本文已影响0人  双鱼子曰1987

一、概述

Apple早在iOS10就退出NotificationServiceExtension的扩展,并不是必备项目,因此各家公司产品支持各不相同,主要取决于产品的实际需求是否需要。

2021年我所在项目的一个需求是:“推送内容显示图片(title-image),即推送支持简图”,这个需求就需要用到NotificationServiceExtension 的相关内容。

百度有很多集成的教程,不知道为啥,很多都只说了其中一个片面,其原因在于很多都只是看了官网的教程,实际开发中遇到的问题没有写出来。

以下是相关笔记,
特别是扩展是如何与宿主App的Target关联的?
如何被打包进宿主App的?
它在宿主App的包里面长什么样?
它是如何和宿主App一同提审?

二、NotificationServiceExtension原理篇

1、NotificationServiceExtension 的作用是什么?

NotificationServiceExtension属于AppExtension(扩展)的范畴,属于官方推出的扩展。同NotificationContentExtension一同丰富用户的推送体验,让开发者可以本地拦截和修改推送内容的机会,可以自定义自己的推送内容展示样式。大大提高了整体的用户体验。

2、NotificationServiceExtension相关特性(官网翻译)

3、UNNotificationServiceExtension工作原理篇

详见鄙人另外整理笔记。AppExtension:扩展的学习笔记

三、UNNotificationServiceExtension的实践

1、前提

推送主工程必须开启推送功能,证书也必须支持,bundleId不能包含通配符,这些是基础知识。


1F44689C-0A8E-432D-A3F4-D25E42639203.png

2、创建

在项目工程中,新建Target的方式集成(一个工程允许存在多个Targets),如下


19448884-9DF3-42B3-B64F-A5AD8C130CE0.png

系统模板自动创建:NotificationServiceExtension的文件夹、NotificationService : UNNotificationServiceExtension子类、info.plist配置文件。

CC6A72C8-1FAF-4E7A-ADEC-354DADEB01B4.png

其中info.plist配置文件,扩展关键配置如下,id固定com.apple.usernotifications.service不能更改,class对应子类类名。后续扩展Target的相关配置都在这里面,需要网络的需要开启App Transport Security SettingsAllow Arbitrary Loads为YES。

8BAD934E-85B5-4871-82A2-528DE45ADEF6.png

2、主工程Target与扩展Target的关系(关键的关键)

很多网上的教程都没有说明这点,以至于后续打包和提审都难以理解其原理。(网上很多直说无法单独提审,必须与ContainApp一起提审。)

3、调试

网上内容也很多,主要是以下几步:

调试一些问题

4、打包&提审

上面可知,扩展的Target是通过依赖主工程Target的方式一同编译打包的,因此后续打包提审的时候只要对应的配置好证书,打包主工程App,然后提审就行。


47ACD5CC-88CD-4645-83EA-A857556C93A7.png

As with any target, an extension target specifies settings and files that combine to build a product within your app project.
Each template includes extension point–specific implementation files and settings, and produces a separate binary that gets added to your containing app’s bundle.

注意:打包导出的时候,需要同时勾选主Target和扩展Target的对应证书。


9CE6BFF5-D922-4CDB-9979-C464CB585B99.png

四、带图片的推送需求实现

”带图片的推送“需求具体实现,主要是把图片自行下载,然后保存,添加到对应的类中属性即可。

UNNotificationAttachment *resourceAttachment =
[UNNotificationAttachment attachmentWithIdentifier:@"photo" URL:obj options:nil error:&attachmentErrer];
if (resourceAttachment && !attachmentErrer) {
    strongSelf.bestAttemptContent.attachments = @[resourceAttachment];
}

本文不再累赘,参见iOS10推送必看UNNotificationServiceExtension,或者自行百度。

五、UNNotificationServiceExtension 其他

具体见AppExtension:扩展的学习笔记


参考

官网-UNNotificationServiceExtension
官网-Modifying Content in Newly Delivered Notifications

上一篇 下一篇

猜你喜欢

热点阅读