iOS 12 通知新特性 —— 自定义 App 通知的外观

4,758 阅读7分钟

自定义 App 通知的外观

原文链接:Customizing the Appearance of Notifications

使用通知内容应用扩展程序来自定义 iOS 应用的通知提醒的外观。

框架

  • UserNotificationsUI

目录

概述

当 iOS 设备收到包含提醒的通知时,系统将分两个阶段显示提醒内容。一开始的时候,它会显示带有标题,副标题和来自通知的两到四行正文文本的缩写的横幅。如果用户按下横幅,iOS 会显示完整的通知界面,包括任何与通知相关的操作。系统为缩略横幅提供界面,但你可以使用通知内容应用扩展程序自定义完整界面。

Screenshots showing the abbreviated banner and the full notification.

通知内容应用扩展管理可以显示你的自定义通知界面的视图控制器。该视图控制器可以补充或替换你的通知的默认系统界面。你可以使用你的视图控制器来:

  • 自定义各项的位置,包括提醒的标题、副标题和正文。

  • 用不同的字体或样式替换界面元素。

  • 显示特定于应用的数据(例如,存储在通知有效内容的特定键中的数据。)

  • 包含自定义图片或品牌。

应用扩展必须使用现有的数据来配置其视图控制器,例如通知的内容和应用扩展包中存在的文件。如果使用应用程序组在应用和扩展之间共享数据,那么还可以使用在应用程序组中的任何文件。为了确保能够及时提交通知,需要尽可能早地布局视图。请不要执行任何长期运行的任务,比如尝试通过网络检索数据。

注意: 通知内容附加应用信息仅支持 iOS 应用。有关如何自定义 watchOS 中的通知外观的信息,请参见 watchOS 的应用程序编程指南.

将通知内容应用扩展添加到你自己的项目

向 iOS 应用添加通知内容应用程序

  1. 在 Xcode 选择 File > New > Target

  2. 从 iOS 应用扩展中选择通知内容扩展。

  3. 点击 Next

  4. 命名。

  5. 点击 Finish

注意: 你可以向项目同时添加多个通知内容应用扩展,但每个扩展都必须支持一组唯一的通知类别。你可以在其 Info.plist 文件中指定应用扩展的类别,如声明支持的通知类型中所述。

将视图添加到视图控制器中

Xcode 提供的模板包含一个 storyboard 和一个视图控制器供你配置。通过向视图控制器添加视图来构建自定义通知界面。例如,使用 label 显示通知的标题,副标题和正文。你还可以添加显示非交互式内容的 ImageViewView。你无需为视图提供任何初始内容。

你可以在 iOS 12 及更高的版本中添加交互式控件(例如按钮或开关)。有关更多信息,请参阅支持交互式控件。

重要提醒: 千万不要将其他视图控制器添加到你的应用扩展或 storyboard 文件。你的应用扩展必须只包含一个视图控制器。

配置视图控制器

你可以使用视图控制器的 didReceiveNotification: 方法来更新其 label 和其他视图。通知的有效内容中包含了配置视图控制器时所需要使用的数据。你还可以使用应用扩展中的其他文件的数据。列表 1 展示了这个方法的一个版本,它从通知内容中检索标题和正文,并将字符串赋给两个 UILabel 控件,这些控件会作为输出存储在视图控制器上。

列表 1

在运行时配置通知接口:

func didReceive(_ notification: UNNotification) {
   self.bodyText?.text = notification.request.content.body
   self.headlineText?.text = notification.request.content.title
}

如果在视图控制器已经可见的情况下,收到第二次通知,那么系统会再次使用新的通知内容来调用 didReceiveNotification: 方法。

声明支持的通知类型

你需要指定通知内容的应用扩展为其提供界面的通知类型。当它收到通知时,系统会将通知的类别值(类型)与你的应用中任何通知内容应用扩展的声明类别进行匹配。如果找到匹配项,系统将加载相应的应用程序扩展。

在通知内容应用扩展的 Info.plist 文件中,使用你的扩展所支持的通知的类别字符串来配置 UNNotificationExtensionCategory 键。类别字符串是你从 iOS 应用注册的 UNNotificationCategory 对象中包含的标识符。你可以使用这些字符串来区分应用可以接收的通知类型。例如,可以在任何指定收到新会议邀请的通知中包含字符串 MEETING_INVITE。标识符字符串会区分大小写。

图 2Info.plist 文件中显示了两种不同通知类型的通知内容应用扩展。由于它支持两种类型,UNNotificationExtensionCategory 键的值由一个数组组成,其中字符串为 GENERALPLANE_AVAILABLE。如果收到任何一种类型的通知,系统都将显示来自此通知内容应用扩展的界面。

图 2

配置通知内容应用扩展的 Info.plist文件

A screenshot of the plist editor, showing the UNNotificaitonExtensionCategory for two notification types.

注意 UNNotificationExtensionClass 键的值默认是一个字符串,它允许你的通知内容应用扩展只支持一种通知类型。若要支持多种类型,请将字符串类型更改为字符串数组。

对于本地通知,请将其类别字符串放入 UNMutableNotificationContent 对象的categoryIdentifier 属性中。对于远程通知,将字符串放入 JSON 的 category 键中。有关声明应用程序的通知类型的信息,请参阅声明可操作的通知类型

有关 Info.plist 文件中键的更多信息,请参阅 UNNotificationContentExtension

隐藏默认通知界面

系统会在每个通知中显示一些默认信息,包括自定义界面的信息。系统始终显示包含应用名称和图标。系统还会显示带有标题,副标题和通知正文的界面,但如果你愿意,可以隐藏该界面的这一部分。

例如,如果你自定义的界面显示来相同的信息,则可能会隐藏默认通知界面。图 3 说明了包含和不包含默认内容的通知界面的布局。

图 3

通知界面的布局

The default interface displays a header, followed by your custom content, followed by the default system content. If you hide the default system content, only the header and your custom interface are displayed.

若要删除默认系统内容,请将 UNNotificationExtensionDefaultContentHidden 键添加到扩展的 Info.plist 文件中,并将该键的值设置为 true。有关此键的更多信息,请参见 UNNotificationContentExtension

将媒体融入到你的界面中

为了支持从自定义通知接口播放音频或视频,请实现以下操作:

系统为您绘制媒体按钮,并且处理所有用户交互。当按下按钮时,它会调用 mediaPlaymediaPause 方法,这样一来,你就可以控制开始和停止播放了。

若要以编程方式来启动或停止播放媒体文件,请调用当前的 NSExtensionContext 对象的 mediaPlayingStartedmediaPlayingPaused 方法。使用视图控制器的 extensionContext 属性来访问扩展上下文。

支持交互式控件

在 iOS 12及更高版本中,你可以在自定义通知中启用用户交互。你可以将交互式控件(如按钮和开关)添加到自定义界面中。

若要启用用户交互:

  1. 打开你的通知内容扩展的 info.plist 文件。

  2. UNNotificationExtensionUserInteractionEnabled 键添加到你的扩展属性中。给它一个布尔值,设置为 YES

图 4 展示了 info.plist 文件,并启用通知。

图 4

在通知扩展的 info.plist 文件中启用用用交互功能

A screenshot of the plist editor, showing the UNNotificationExtensionUserInteractionEnabled key added to the NSExtensionAttributes dictionary.

了解更多

通知内容应用扩展

UNNotificationContentExtension :为传递本地或远程的通知提供自定义接口的对象。