-
使用分组通知
对您的 app 发送的通知进行分组,帮助用户在一瞥之间查看更多信息,并让用户可以同时管理多个通知。了解如何在 app 内实现分组通知功能。
资源
- Human Interface Guidelines: Notifications
- Human Interface Guidelines: Managing notifications
- Using, Managing, and Customizing Notifications
- User Notifications
- User Notifications UI
- 演示幻灯片 (PDF)
相关视频
WWDC18
-
搜索此视频…
(通知群组的使用 演讲711)
谢谢 下午好 欢迎 我叫Michele 在iOS用户通知团队工作
几分钟前 同事Kritarth和Teja 向你介绍了群组通知 现在我们将更详细地 探讨这个功能 我们将学习如何使用 如何提高它的效率 以及如何使其更有条理
首先我们简要概述一下 该功能的工作原理 以及UI的各部分如何协调 然后我们来看看默认分组 及app分组 我们将了解如何创建自定义通知群组 以便你根据app内容调整群组
最后 我们将学习 如何为你的新通知群组 创建切题的摘要
我们先简要介绍一下该功能的UI
通知群组收集不同通知 并将它们分组排一个小堆栈中 这样使Notification Center更有条理 并且对用户更高效 这样用户可以同时看到更多通知 而不会被任何全屏的app挡住 从而看不到一些内容
每个通知群组都会在其顶部 显示本组的最新通知 我们将此称为主通知
主通知下方 每个组会显示一个简短的摘要 提供一些 关于组中包含的其他通知的细节 提供一个组内通知总数 有时还有有关通知内容的详细信息
通知群组还有助于通知分类 例如 只需轻轻一滑 你可以清除该组中的所有通知 全部清除它们
同样容易的是扩展群组 查看内部的所有通知 并一次阅读其中一条通知 也许清除一条 当完成后 你可以清除所有通知 用顶部的组按键 清除所有组内通知
这是对该功能的一个非常简短的概述 让你熟悉对UI的不同部分和术语 现在我们看看这些群组如何运作 以及如何创建它们
默认行为是app分组 每个app都有自己的群组 来自该app的所有通知 都集中到该组 如果你不作任何操作就是这个设定 你会在不采用任何新API的情况下 继续发送通知
许多情况下 app分组就足够了 而且效果非常好 例如 在播客app 所有通知同属一组 因为播客发的通知非常类似 它们是节目新剧集的通知 所以 不存在有的具体通知更有意思 或更重要 而需要作不同的显示
刚才说过 我们可以轻松点击群组 扩展群组 并查看该组内的详细信息
所以 app分组很好 它使通知更有条理 使Notification Center 更紧凑易用 但许多app有更特别的内容 它们可能需要不同的组织方式 使通知更有效率 据此 我们可以创建自定义分组 在这场讨论中 我们将首先看看 用于为通知创建自定义组的API 然后我们看一下iOS 12中的 一些app示例
探索这些app采用的一些模式 以及它们在用户可见的内容 以及群组涵盖内容 之间如何寻找平衡 以帮助Notification Center的组织
这就是为你的app创建群组的方式 你只需在通知内容中 设置自定义线程标识符
完成此操作后 你使用相同线程标识符 发送的所有通知 将在Notification Center 组合在一起
线程标识符可以是任何字符串 用什么标识都没关系 所有通知都会据此组合在一起 你只需要为其独特命名 你只需要一个唯一的字符串 作为群组标识符
这就行了 你为通知创建了一个群组 但鉴于它如此简单 我们需要注意如何创建这些组
而且如果你熟悉通知API 你会注意到这不是一个新的API 这是前期iOS版本中引入的API 因此 它已经存在于当前的iOS中 过去我们介绍了丰富的通知 和私人通知 所以 如果你已经采用了这个API 以支持以前iOS版本中的 这两个功能 你的通知已经在iOS 12中 进行分组
你可能想要复习群组的创建方式 因为现在API的上下文有点变化 所以稍微调整一下可能会更好
在这个例子中 你看到了如何创建一个线程 在本地通知上设置线程标识符
你可以在推送有效负载上 设置推送通知
好 现在让我们来看看 iOS 12中的几个例子
在我们看这些例子时 请记住最重要的一点 即通知分组的目标 通过对通知进行分组 我们希望提高通知效率 并改进 Notification Center的组织 你可能熟悉这种情况 某个app发送了许多通知 也许你在app里聊天 有人发送了大量消息 我们想通过组织通知来改善这种情况 以便用户可以更有效地使用它们
我们的第一个例子是日历
根据你的生活组织方式或工作地点 日历可能会发送 很多事件更改及事件邀请的通知
但并非所有通知都有相同的重要性 日历发送的有些通知 比其它通知更重要 这些是…
你在创建活动时设置的事件提醒 或“该走了”通知 这些通知更重要 因为它们提示我现在要采取行动 如果我收到通知 说我在15分钟内有个会 我需要开始去赴会 但许多其他通知 不需要立即回应 比如分享日历的更新 或其他事件的时间变化 当天晚些时候或某天
所以分开这两类通知很有用
日历的作法是用默认组即app组 处理发送的大部分通知 实现办法是 对大部分通知 不设置任何线程标识符 邮件是默认值 如果你不设置它 这是默认的群组
然后 日历设置特定的线程标识符 仅针对这些更重要的通知 我们想特别提起注意的通知
结果就是…
来自日历的大多数通知都是信息更新 不需要立即做出反应 或者不需要留给以后参考 例如提示事件位置的通知 它们就组合在一个组中 而其他更重要的 更紧急的 或者需要稍后引用的那些通知 比如找到会议地点 这些通知是分开的
我展开一下 看到我的群组还有什么
这是我们从日历中学到的模式 把重要且可操作的通知 与信息更新的通知分隔开
我们的下一个例子是短信
短信可能是 最简单的通知群组的实现 显而易见 短信包含对话 每个对话都有自己的群组
但我们仍可以学到重要的东西 我们仍然可以从短信中学习 为什么短信把所有对话 分在不同的组中?
短信发送的通知 通常来自人 来自你的朋友和家人 这些是我们关心并重视的通知 其次 它们通常是短暂的通知 因为通常情况下 你会在短信中快速响应 从而从Notifications Center清除
短信的做法 是为这些一对一对话创建一个线程 它会创建一个单独的通知组 用于群组对话 只需为该线程生成任何组标识符 并将它们组合在一起
我可以展开并看到我的所有消息
那么我们从短信中学到了什么? 为有意义的个人通信创建群组 这些短信通知 通常很重要 它们在Notification Center 只短暂存在 因此 我们为所有这些组创建许多单独的组
我们的最后一个例子是邮件
邮件与短信 有一些相同的特征 它们都经常是人与人的直接沟通 二者有类似的概念 如线程及对话
但邮件和短信之间存在一些重大差异 邮件的通知数量可能高于短信 另一方面 邮件通知的有效期也可能更长
邮件通常用于较慢的通信 一般不需立即回应
所以 按线程组织邮件通知并不理想 这将在Notification Center中 创建很多线程 这样的UI效率不高 邮件提供了特定UI显示邮件线程
那么 邮件如何组织其通知?
首先 邮件提供了一些邮件到达时 已有的组织的功能 和优先处理功能
邮件提供单独的帐户 你可以拥有并在你的设备中 设置许多不同的帐户 提供VIP功能 你可以将任何联系人设置为VIP
你可以设收藏夹 你也可以在邮件客户端 打开特定线程的通知
所以似乎用户已经在告诉我们 哪些通知和邮件更重要 哪些不太重要 这就是邮件所做的 邮件首先从帐号组开始组织通知 它为所有投递给特定帐号的邮件 创建一个大帐号 如果我有多个帐号 每个帐号都会拥有自己的群组
然而
如果我的VIP联系人 向该帐号发送邮件 该邮件会被分到另一个群组 因为我指定了那是VIP 当VIP发送电子邮件时 我希望 立即得到通知
而且如果我打开邮件内 某些特定线程的通知 它们也会分离到自己的小组中
所以你看到虽然邮件与短信 在某些特征上类似 它们分组通知的方法略有不同 因为它们使用通知的方法 及处理的内容不同
那么 这里邮件在告诉我们什么? 尊重用户的优先级设定和组织 邮件具有组织和确定优先级的功能 我们可以用它来组织邮件发送的通知
(通知组摘要) 我们已看到了如何创建任意数量的组
我们来看看 如何通过在组内提供一些信息 描述它们包含的内容
而使这些群组更加清晰
这些例子是我上周的 Notification Center 这里我们看到 每个小组底部有一个简短的摘要 了该组的内容略作解释 例如 邮件说 我的工作帐户中有几封电子邮件
播客说我有一堆新剧集 已发送到我的播客app以收听
而新闻告诉我 我有九个 来自《国家地理》杂志的通知
让我们稍加探讨一下 如果你不自定义摘要 我们在组中设置了默认消息 说你还有九个通知 但我们可以更好地描述这些内容 例如 如果你有一个 发送消息的app 你可能想说你正在发送九条消息 怎样做到这个?
第一件事就是选择摘要格式 这是一个格式字符串 只是用数字占位符描述你的内容 正如我们在这里看到的 数字 更多消息
然后在通知类别中设置 你将用于发送通知的格式字符串
注意 摘要格式是在类别上设置的 而线程是在通知内容上设置的 这是因为如你所知 类别 指的是类型 是你发送的类似的通知组 例如 短信有不同的类别 用于一对一对话和群组对话 这意味着这两个类别 可以设置不同的摘要 这就是在类别中设置摘要格式的原因
当你在这里时 更新通知组的通知类别 你也可以设置这个 hiddenPreviewsPlaceholder属性 与我们用于通知组的摘要非常相似 这两者之间的主要区 别在于它们的使用环境 hiddenPreviewsPlaceholder 不是新功能 这是我们去年在iOS 11中 推出的一项功能 它会自定义显示的文本 而不是用户将其通知 设置为私有时的通知 如果我将通知设置为私有 我说九条短信 但是 当我作身份验证并解锁设备时 我可以在下面看到展开的通知和摘要 说还有八条短信 这就是为什么摘要格式包含更多消息 但预览占位符仅包含短信数
这就是摘要的基本设置 但是群组对话的消息 有一个更有趣的摘要 其中显示了短信的数量 还有在那个线程 那个对话 发短信的人
我们不能用刚刚指定的格式 来做到这个 因为它只有一个数字占位符 所以 我们要做的是 创建一个不同的摘要格式 包含数字占位符和字符串占位符 如你所见 数字更多来自字符串的消息 我们将把第二个占位符 以通知中的名称列表来替换
仍然在类别中设置摘要格式
然后我们必须收集这些名称
要发送这些名称 再次在通知内容中进行设置 因为每个通知都可以由不同的人发送 可以是不同的名字
所以 我们收集所有这些名字 在字符串中构建并在摘要中替换它们 当然 推送有效负载也支持摘要参数
这就是我们收集所有名称后的摘要 并在摘要参数中设定其格式
名称不必是唯一的 你可以用同一个名称发送许多通知 例如 在邮件案例中 所有通知都具有相同的名称 因为它们都在同一个帐号中 我们将删除重复数据 并且只显示每个可见名称的一个实例
下一个例子是播客 播客向我们展示了 此API的另一小细节
此通知有什么特别之处? 在此通知中 播客说 我的主要通知播客中有两集新剧
总结说众多节目中 还有七集 当我扩展这个群体时会发生什么?
群组中只有三个外部通知 不像总结说的那样是7个 在之前的例子中 摘要中的数量 与组内通知数量相匹配
那么这是怎么回事?
因为播客集中这些通知 并在一个节目发布多集时 试图限制发送的通知数量 同时 它有这些通知说 “有两集新剧集选择 有三集新剧集选择”
如果你把底部三个通知中的剧集 数量加起来 这就是摘要所算的 你可以看到总数是7
让我们看看这个API是如何工作的
这只是通知内容的另一个属性 称为summaryArgumentCount 此数字表示 在摘要中摘要参数的计数
我们将再次收集所有名称 我们将统计所有计数 创建摘要
正如我们所看到的 这个通知会有 summaryArgumentCount计数 三 一 三 总计为七 这就是我们展示的摘要
而且和其它部分一样 你当然可以在推送有效负载中设置它
summaryArgumentCount 是可选的 默认为1 因此你只有对通知 进行此类捆绑时才需要设置 而非任何时候都需要设置
(摘要复数和本地化) 现在 我们正在玩文字 建句子 而且这时 你一直需要考虑不同的语言 并且在这种情况下需要考虑复数 因为有数字
另一个播客通知 例如 在这种情况下 它说“还有四集” 但如果我只有一集 那个字符串就需要用单数 但API只允许我们设置一个字符串
而我们需要两个
你需要两个的英语表述 但是如果你想本地化你的app 或者如果你的主要语言不是英语 你正在为不同的语言做开发 某些语言对复数有不同的规则 也许它们没有两个形式 而可能有三个 它们可能会有适用不同规则的形式
iOS 在Foundation框架中 提供了对本地化这类字符串的支持 所以你不需要学习所有的规则 你不需要知道 你要将你的app翻译成的所有语言 采用和翻译每个字符串非常简单 拥有正确的复数形式
我们需要做的第一件事就是采用 这“修复我们的复数问题” 是将摘要格式中的 文字字符串用本地化字符串代替
并请记住 在这里 你需要使用 我们针对本地化字符串的 特殊通知API 因为我们需要存储这个本地化的 字符串并将其放在一边 因为如果系统语言稍后发生变化 如果你发送通知 我们会发送系统本地化更改后 正确的本地化信息
因此 在这里设置本地化字符串后 你需要本地化字符串
并在字符串dict文件中 本地化字符串 字符串dict文件 是一个属性列表文件 它描述性能字符串和配置字典 这个文件在底部的配置字典中 你会看到英文单数和复数的两个版本 如我所说 要想支持其他语言 和不同的复数规则 你要做的就是改变这个dict文件 你创建一个新文件 希伯来语有三种不同的复数形式 俄语有三种复数 与希伯来语亦不同 而且你不需要知道何时使用哪一个 若你用我们提供的 Foundation API
这是我们刚刚看到的简单摘要格式 当然我们也可以使用参数格式化摘要 你看 我们在顶部定义了格式字符串 我们需要按键匹配配置字典
在下面 我们为两个不同的版本 用数字占位符指定了两个字符串 以及我们将提供名称的列表的占位符
所以… 因为我们正在交换 app和系统之间的这些格式字符串 这些实际上是API的一部分 因此 我们可以支持的格式数量有限
我们需要就这些达成一致 这就是我在这些例子中 展示的那些格式 第一个是当你不需要参数时 带有一个数字占位符的格式 你需要指定一个无符号数字
你可以使用的第二种格式 是有数字占位符 和字符串占位符的那个 我们将自动检测你正在使用的字符串 并赋予正确格式
(快速提示) 现在我们都完成了通知分组的功能 但在你离场之前 我想再给你一点 关于通知分组和这些API的提示 这将帮你完成app中的 最后一点美化
第一步是组合不同的摘要
我们看到你可以 在不同的类别中设置不同的摘要 并在通知内容中并定义线程组 表示你可以在同一组通知中 混合不同摘要 当你这样做时会发生什么? 两类主要结果 如果该组中的任何摘要都没有参数 我们将尝试 合并列表中的所有摘要并这样显示
但是如果组内任何通知摘要 有任何参数 我们将不得不回到默认消息
第二个提示是关于丰富的通知和组
我们不久前在iOS中 引入了丰富的通知 它们与群组通知可同时工作 当用户按下某个组 以查看丰富的通知时 将加载该群组的内容扩展程序 你的通知 将被主要通知加载 显示在顶部的那个 用通常的didReceive Notification API 你将在通知中收到它
加载扩展程序后 你可以加载其他通知 例如 组中的相同通知 或者如果你想显示不同的内容 你也可以使用自己的API加载它
当你的扩展程序打开且运行时 如果其他通知发送到同一组 它们有相同的线程标识符 将和开始时一样 用didReceive Notification方法 被发送到你的内容扩展程序
最后 如果你已经通过 从递送通知中加载的方法 或从你自己的API加载 向用户显示了额外的通知 你该从Notification Center中 删除它们 继续保持Notification Center的 有序性和效率
我想回顾一下我们谈到的内容 这是一段很长的谈话 有很多细节 但我只希望你记住两件非常重要的事 第一个是通知分组的目标 通知分组的目标是更好地组织 Notification Center 并帮你的用户在使用通知时提高效率 这将帮助他们对通知进行分类 并让他们更快地接收重要信息 更好地做出反应
我希望你记住的第二件事 是添加自定义摘要以提高清晰度 正如你在我的示例中所看到的 例如播客或邮件 通知组下方的一小段文字有助于 查看该组中还有哪些新通知 而且我不需要打开通知群组 来查看所有有关内容 摘要已经提供了一些信息
我们将在本次会议结束后不久 在楼下有个实验室 明早我们将有另一个实验室 我们期待与你交谈 周五还有另一场关于通知的会议 更多地讨论设计方面的问题 及如何跨所有用户设备和不同系统 全局化考虑你的通知
非常感谢 再见
-