WWCD 2018:通知分组的使用

Session 711 : Using Grouped Notificationshtml

前言

iOS 12 为通知带来了很多新特性,而在这些新特性中通知分组最为吸引眼球。对于此次通知的新特性还不了解的同窗能够点击这里。 本文针对这一新特性从如下几个方面进行阐述:swift

  • 按应用分组和自定义通知分组( App grouping & Custom grouping )
  • 通知摘要( Notification Groups Summaries )
  • 通知分组的设计准则

1. 按应用分组和自定义分组( App grouping & Custom grouping )

按应用分组

默认状况下系统会按照应用( bundle id )把收到的通知分红不一样的组,每一个组的顶层是该组收到的最新通知,伴随着当前组的通知摘要( group summaries )。 markdown

咱们能够经过左滑管理,查看,清除组里的通知,也能够点击展开组里的通知逐个处理。

自定义分组

按应用分组的模式没法知足丰富的显示通知场景,重要的通知可能会被不重要的通知遮盖而没法达到提示的做用,这时候就该自定义分组大显身手了。 要实现自定义分组开发者只须要给想要额外分组的通知加上线程标识( thread identifier )便可:本地通知直接为 content 的 threadIdentifier 参数赋值,而对于远程通知而言,在通知的 payload 中添加以 thread-id 为键的键值对。session

// 本地通知
let content = UNMutableNotificationContent()
content.title = "Notifications Team"
content.body = "WWDC session after party"
// 自定义标识
content.threadIdentifier = "notifications-team-chat"

// 远程通知
{
	"aps" : {
		"alert" : {
			"title" : "New Photo",
			"body" : "WWDC session after party"
		}
		// 自定义标识
		"thread-id" : "notifications-team-chat"
	}
}
复制代码

注:Session 711Session 710 在远程推送的 payload 中写法有出入,看官方文档的解释应该以这里为准。app

2. 通知摘要( Notification Groups Summaries )

当通知被分组以后,若是没有一个提示信息告诉咱们当前分组中有多少条信息,这些信息的简单描述是一件很不方便的事情,苹果提供了通知摘要为咱们实现这个功能。ide

简单通知摘要( Simple Notification Group Summary )

在通知概要以及如何自定义通知摘要以前,有一个概念须要先拿出来讲一下:oop

摘要参数数量( Summary Argument Count )

摘要参数数量表明了 1 条通知所包含的内容量。这样说可能有点抽象,咱们以 Podcase 为例,Podcast 为了减小推送的总量,会把某个节目同一时间更新的几条内容合成一个推送,这就造成了咱们下面看到的状况。 post

iOS 12 为 UNNotificationContent 和 UNMutableNotificationContent 增长了新的 NSUInteger 参数:summaryArgumentCount 。若是不设置,这个值默认为 1 。

// 本地推送设置
let content = UNMutableNotificationContent()
content.body = "…"
content.threadIdentifier = "…"
content.summaryArgument = "Song by Song"
content.summaryArgumentCount = 3

// 远程推送设置
{
	"aps" : {
		"alert" : {
			"body" : "…",
			"summary-arg" : "Song by Song",
			"summary-arg-count" : 3
		},
		"thread-id" : "notifications-team"
	}
}
复制代码

包含全部未展现通知摘要参数数的通知摘要

了解了摘要参数数量以后,咱们来看一下最基本的通知摘要组成格式。ui

let summaryFormat = "%u more messages"

return UNNotificationCategory(
	identifier: "category-identifier",
	actions: [],
	intentIdentifiers: [],
	hiddenPreviewsBodyPlaceholder: nil,
	categorySummaryFormat: summaryFormat,
	options: []
)
复制代码

summaryFormat 中使用了 %u 来为通知组中全部未展现通知的摘要参数数量之和占位( 未展现通知指通知组中除了栈顶通知的其他通知 )。spa

隐藏通知详情时展现的通知摘要( Hidden Previews Summary Customization )

咱们能够看到在 UNNotificationCategory 初始化时能够设置的参数中有另一个参数 hiddenPreviewsBodyPlaceholder ,若是用户设置了在锁屏状况下不展现通知具体内容( iOS 11 新增的特性 ),咱们能够设定这个参数来展现不一样的摘要内容。

let summaryFormat = "%u more messages"
let hiddenPreviewsPlaceholder = "%u messages"

return UNNotificationCategory(
	identifier: "category-identifier",
	actions: [],
	intentIdentifiers: [],
	hiddenPreviewsBodyPlaceholder: hiddenPreviewsPlaceholder,
	categorySummaryFormat: summaryFormat,
	options: []
)
复制代码

在 hiddenPreviewsBodyPlaceholder 也是用了 %u 来为通知组中全部通知的摘要参数数量之和占位。

为了更好的理解这两种状况的区别,咱们依然以 Podcast 的那张图为例。若是咱们设置了不展现通知具体内容,通知组的摘要中会显示:“ 9 new episodes are available. ” ( 2 + 3 + 1 + 3 );而若是咱们没有设置,则会显示:“ 7 new episodes are available. ” ( 3 + 1 + 3 )。

带参数的通知摘要( Notification Group Summary with Arguments )

上图中展示的是 Messages 群聊时通知摘要会提示你消息的来源,要实现这个效果须要调整咱们的 summaryFormat 字符串。

let summaryFormat = "%u more messages from %@"

return UNNotificationCategory(
	identifier: "group-messages",
	actions: [],
	intentIdentifiers: [],
	hiddenPreviewsBodyPlaceholder: nil,
	categorySummaryFormat: summaryFormat,
	options: []
)
复制代码

咱们使用 %@ 来为摘要参数占位。那什么是摘要参数?

摘要参数( Summary Argument )

和摘要参数数量同样,摘要参数是 iOS 12 UNNotificationContent 新增长的用来拼成 UNNotificationCategory 的摘要格式化字符串。

// 本地推送设置
let content = UNMutableNotificationContent()
content.body = "…"
content.threadIdentifier = "notifications-team"
content.summaryArgument = "Kritarth"

// 远程推送设置
{
	"aps" : {
		"alert" : {
			"body" : "…",
			"summary-arg" : "Kritarth"
		},
		"thread-id" : "notifications-team"
	}
}
复制代码

iOS 系统会为咱们将未展现的通知中的摘要参数合成一个字符串展现给用户。 注:摘要参数不须要每条通知都不一样,咱们可使用相同的摘要参数,系统会筛选不一样的摘要参数进行字符串合成,下图中邮件就是用 iCloud 邮件帐户做为摘要参数。

通知摘要的本地化( Summary Localization )

若是咱们须要让 App 应对不一样语言的场景,只须要两步,简直比把大象放进冰箱还方便!

  • 将 summaryFormat 转换成本地化字符串
let summaryFormat = NSString.localizedUserNotificationString(
	forKey: "NOTIFICATION_SUMMARY",
	arguments: nil
)
复制代码
  • 根据不一样的语言提供不一样的 .stringsdict 文件 关于 . stringsdict 文件的具体内容就不在这里赘述了,点击这里查看如何使用,点击这里查看文件格式。
    上图以英语为例,若是要支持别的语言,只须要替换高亮出的文本便可。

合并同个通知组中不一样的摘要

因为通知摘要是定义在 UNNotificationCategory ,而线程标识是定义在通知内容中,有时候会碰到须要合并同个通知组中不一样的摘要的状况。

  • 若是通知组中全部的通知都是不带摘要参数的简单摘要,全部的摘要会被合并。例:5 more messages and 3 more photos ;
  • 若是通知组中含有带摘要参数的摘要,合并后的通知摘要会被降级为默认摘要。例:8 more notifications ;

使用通知内容扩展通知的分组

  • 扩展默认接收栈顶的通知,并调用 didReceive 接口
public protocol UNNotificationContentExtension : NSObjectProtocol {
	public func didReceive(_ notification: UNNotification)
}
复制代码
  • 经过调用系统 API 获取分组中其他的通知
class UNUserNotificationCenter : NSObject {
func getDeliveredNotifications(completionHandler:([UNNotification]) -> Swift.Void)
}
复制代码
  • 扩展页面展开时有新的同一分组的通知进来,一样会调用 didReceive 接口
public protocol UNNotificationContentExtension : NSObjectProtocol {
	public func didReceive(_ notification: UNNotification)
}
复制代码
  • 当通知被展现完毕后,你须要将通知从通知中心移除
class UNUserNotificationCenter : NSObject {
	func removeDeliveredNotifications(withIdentifiers identifiers: [String])
}
复制代码

3. 通知分组的设计准则

Session 中以系统的 3 个 App 为例提出了在设计通知分类的时候须要注意的地方。

将重要的,可交互的通知从消息更新类通知中分离出来( Separate important, actionable notifications from informative updates )

日历 App 在 iOS 12 中将提醒的通知单独设置 threadIdentifier ,其他通知使用默认分组。为更重要的通知设置不一样的分组能更好的起到通知的做用。

为有意义的,私人的通信创建分组( Create groups for meaningful personal communications )

对于相似 Messages 的 App 来讲,它们推送的通知对于使用者经常是有意义的,这类的信息在通知中心的停留时间相对较短( 人们倾向于尽快处理这类信息 ),所以为这些通知生成单独的分类是颇有必要的。

尊重用户的优先级和组别( Respect the user’s priorities and organization )

以邮件 App 为例,邮件默认是按照不一样的帐户分组的( iCloud 帐户,Gmail 帐户等 ),若是用户将某些发件人标记为 VIP ,邮件会单独为这个用户创建一个分组。当咱们为某个邮件设置了 “通知我” 时,回复了这个邮件主题的通知也会被单独归到一个分组中。

总结

通知分组强化了 App 推送的信息展现能力,对于开发者来讲为通知设置线程标识也十分便捷。相信随着 iOS 12 的到来能有愈来愈多的 App 利用自定义通知分组的特性为用户提供更有效的通知。

查看更多 WWDC 18 相关文章请前往 老司机x知识小集xSwiftGG WWDC 18 专题目录 - 简书

相关文章
相关标签/搜索