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 )。 session

咱們能夠經過左滑管理,查看,清除組裏的通知,也能夠點擊展開組裏的通知逐個處理。

自定義分組

按應用分組的模式沒法知足豐富的顯示通知場景,重要的通知可能會被不重要的通知遮蓋而沒法達到提示的做用,這時候就該自定義分組大顯身手了。 要實現自定義分組開發者只須要給想要額外分組的通知加上線程標識( thread identifier )便可:本地通知直接爲 content 的 threadIdentifier 參數賦值,而對於遠程通知而言,在通知的 payload 中添加以 thread-id 爲鍵的鍵值對。app

// 本地通知
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 中寫法有出入,看官方文檔的解釋應該以這裏爲準。ide

2. 通知摘要( Notification Groups Summaries )

當通知被分組以後,若是沒有一個提示信息告訴咱們當前分組中有多少條信息,這些信息的簡單描述是一件很不方便的事情,蘋果提供了通知摘要爲咱們實現這個功能。post

簡單通知摘要( Simple Notification Group Summary )

在通知概要以及如何自定義通知摘要以前,有一個概念須要先拿出來講一下:ui

摘要參數數量( Summary Argument Count )

摘要參數數量表明瞭 1 條通知所包含的內容量。這樣說可能有點抽象,咱們以 Podcase 爲例,Podcast 爲了減小推送的總量,會把某個節目同一時間更新的幾條內容合成一個推送,這就造成了咱們下面看到的狀況。 spa

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"
	}
}
複製代碼

包含全部未展現通知摘要參數數的通知摘要

瞭解了摘要參數數量以後,咱們來看一下最基本的通知摘要組成格式。線程

let summaryFormat = "%u more messages"

return UNNotificationCategory(
	identifier: "category-identifier",
	actions: [],
	intentIdentifiers: [],
	hiddenPreviewsBodyPlaceholder: nil,
	categorySummaryFormat: summaryFormat,
	options: []
)
複製代碼

summaryFormat 中使用了 %u 來爲通知組中全部未展現通知的摘要參數數量之和佔位( 未展現通知指通知組中除了棧頂通知的其他通知 )。設計

隱藏通知詳情時展現的通知摘要( 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 專題目錄 - 簡書

相關文章
相關標籤/搜索