【WWDC21】Notificationの新機能とinterruptionLevelについて



こんにちわ。iOSアプリ開発をしている[@haseken_dev](https://twitter.com/haseken_dev)です。
あまりQiitaを書いてなかったため、リハビリも兼ねて、
WWDC21にて発表された、Notificationの新機能と新enumのinterruptionLevelについて、
業務にも必要そうだったため、簡単にまとめてみました。

# 1. はじめに
この記事はAppleが先日開催したWWDC21にて発表した、Notificationの新機能と新しいinterruptionLevelについて、下記のセッション動画をもとに簡単にまとめました。

[・Send communication and Time Sensitive notifications](https://developer.apple.com/wwdc21/10091)

不足点あるかと思いますが、誰かの参考になれば幸いです。

また、本記事で不備・認識誤りなどがありましたら、ぜひご連絡いただけたら幸いです。

※Communication Notificationに関しては、簡単に触れる程度になっています。
※セッションのスクリーンショットに字幕が入ってしまっています。。。

# 2. 目次
- [Notificationの新規機能について](#3-notification%E3%81%AE%E6%96%B0%E8%A6%8F%E6%A9%9F%E8%83%BD%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
    - [見た目の変更](#31-%E8%A6%8B%E3%81%9F%E7%9B%AE%E3%81%AE%E5%A4%89%E6%9B%B4)
    - [新しいNotificationの管理方法について](#32-%E6%96%B0%E3%81%97%E3%81%84notification%E3%81%AE%E7%AE%A1%E7%90%86%E6%96%B9%E6%B3%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
        - [Notification summary](#321-notification-summary)
        - [集中モード](#322-%E9%9B%86%E4%B8%AD%E3%83%A2%E3%83%BC%E3%83%89)
    - [Interruption levels](#33-interruption-levels)
    - [Announce](#34-announce)
    - [Communication notifications](#35-communication-notifications)
- [Interruption levelsについて](#4-interruption-levels%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
    - [各レベルについて](#41-%E5%90%84%E3%83%AC%E3%83%99%E3%83%AB%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
        - [Passive(New!)](#411-passivenew)
        - [Active](#412-active)
        - [Time Sensitive(New!)](#413-time-sensitivenew)
        - [Critical](#414-critical)
    - [レベルの設定方法](#42-%E3%83%AC%E3%83%99%E3%83%AB%E3%81%AE%E8%A8%AD%E5%AE%9A%E6%96%B9%E6%B3%95)
- [最後に](#5-%E6%9C%80%E5%BE%8C%E3%81%AB)
- [参考](#6-%E5%8F%82%E8%80%83)

# 3. Notificationの新規機能について
今回、WWDC21では新しい機能がいくつか発表されました。

## 3.1. 見た目の変更
![スクリーンショット 2021-06-21 23.17.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453700/dcbb06b7-b835-3de8-78ee-5419e80ec4a2.png)
Notificationはappアイコンと共にコンテンツと関連するメディアに焦点が当たるようにUIが変更されました。

![スクリーンショット 2021-06-21 23.18.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453700/2d11b251-d29d-b965-568e-0d63be8d0f77.png)

また、Notificationのactionにアイコンも置けるようになりました。
これにより、actionが何を行うものなのかを視覚的に判断できるようになりそうです。

![スクリーンショット 2021-06-21 23.19.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453700/287fe8ff-bc0c-c8a5-e97f-008550edd99e.png)
actionにアイコンを追加するには、[UINotificationActionIcon](https://developer.apple.com/documentation/usernotifications/unnotificationactionicon)のオブジェクトを、
システムアイコンか、bundle内(できればAsset catalogs内)の画像を指定して作成し、
UINotificationActionのiconに指定することで表示が可能になります。

セッション内では、Rich Notificationも新しいレイアウトに合わせて動作確認を行うことにも言及されていました。

## 3.2. 新しいNotificationの管理方法について
Notificationの管理方法として、「Notification summary」と「集中モード」が新たに提供されます。

### 3.2.1. Notification summary
![スクリーンショット 2021-06-21 23.30.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453700/f4abf132-6cfd-bbc3-fb0a-cdf7eb2f8fca.png)
一日の中で、スケジュールされた時間にNotificationをまとめて配信できるようになり、
優先順位ごとにまとめて表示させる設定が可能になります。

![スクリーンショット 2021-06-21 23.33.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453700/e44958fc-83ba-41a3-b91a-fd640e630699.png)
Notificationの内容にメディアを添付することで、Notification summaryの中で優先的に表示される可能性が高くなるとのことでした。
また、新しいpropertyの[relevanceScore](https://developer.apple.com/documentation/usernotifications/unnotificationcontent/3821031-relevancescore)を採用して関連性のスコアを提供することで、適切な通知が優先的に表示されるようです。
(まだ試せていませんが、同appのNotificationで比較するために利用されるのではないかと考えています。そうでないと、どのappも最大値を設定して配信することになると思われます。。)

### 3.2.2. 集中モード
![スクリーンショット 2021-06-21 23.38.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453700/93a1b54f-85f8-4787-0146-4f053c27d85f.png)
![スクリーンショット 2021-06-21 23.38.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453700/996ba0f9-f860-78f9-a7e2-5574c24fc5b3.png)
読書、睡眠、仕事など、活動内容や時間帯に応じて、Notificationの表示や中断をフィルタリングできる設定を行えるようになりました。

![スクリーンショット 2021-06-21 23.39.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453700/e944ce14-4d59-79e3-612e-ed4b0818eebe.png)
集中モードの設定では、割り込み通知を送信できる人や、appを選択することが可能です。

![スクリーンショット 2021-06-21 23.39.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453700/84456ec4-150b-e62e-88c2-69aadc84242e.png)
Notificationがこれらの制御を突破する可能性はあるそうですが、それはユーザーが許可した場合のみのようです。
また、Communication NotificationやTime SensitiveなNotificationがその制御を突破する可能性があるとのことでした。
このことより、app開発者は適切なNotificationをユーザーに届ける重要性がより増してきました。

## 3.3. Interruption levels
UserNotification frameworkに新たなAPIである[UNNotificationInterruptionLevel](https://developer.apple.com/documentation/usernotifications/unnotificationinterruptionlevel)が提供されました。
こちらに関しては、[詳細を後述] (#4-interruption-levels%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)します。

## 3.4 Announce
![スクリーンショット 2021-06-22 1.33.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453700/20f15957-4525-dfdf-fef8-12dc113267d7.png)

AnnounceはSiriでNotificationをAirPods Proなどに発話するために利用されています。

![スクリーンショット 2021-06-21 23.45.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453700/0c18cb44-c930-c932-5bf3-d1f0d3f6143f.png)
これまで必要だった[allowAnnouncement](https://developer.apple.com/documentation/usernotifications/unnotificationcategoryoptions/3240647-allowannouncement)は、iOS 15よりDeprecatedになっています。

![スクリーンショット 2021-06-21 23.47.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453700/0aa8e121-9d4f-9f60-2dd7-dbfbf6889e5f.png)
iOS 15より、サポートされているオーディオデバイスに接続されている場合、全ての通知でannounceがサポートされます。
Notificationをアナウンスさせるかどうかはデバイスの設定appから設定ができます。
アナウンスを有効にした場合、CommunicationおよびTime SensitiveがdefaultでONとなるようです。

![スクリーンショット 2021-06-22 0.01.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453700/7e45cddb-ae82-e194-31ae-28cfb48a2d47.png)
また、CarPlayに接続されている間は、Communicationが自動的にアナウンスされるように設定ができるようです。

## 3.5. Communication notifications
![スクリーンショット 2021-06-22 0.03.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453700/38d2a9c3-8e4d-da17-e2dd-f14c219d5037.png)
iOS 15では、通常のNotificationとは別に、電話やメッセージなど、誰かとコミュニケーションによるNotificationを区別するために、Communication notificationsを新しく追加しました。
これによって、よりリッチなUXを提供できるようです。

最も特徴的なものがアバター表示になります。
タイトルには必ず送信者が入り、グループ通信の場合はサブタイトルに受信者が入ります。
![スクリーンショット 2021-06-22 0.04.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453700/52d7fa8c-a617-c287-a34e-45a148b3dc4f.png)

![スクリーンショット 2021-06-22 0.44.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453700/53a9253f-2116-209b-62c8-ff10e92e931c.png)
Communication notificationsを有効にするためには、Capabilitiesで有効にし、
Info.plistのNSUserActivityTypesにIntens typeを追加する必要があります。

![スクリーンショット 2021-06-22 0.08.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453700/6ee744c7-e7d0-fc4d-5e1e-da04a8d82252.png)
![スクリーンショット 2021-06-22 0.29.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453700/01541038-dfb9-8287-ebb2-104723660ec9.png)
現段階では、SiriKitのStandard Intentsである[INStartCallIntent](https://developer.apple.com/documentation/sirikit/instartcallintent)と[INSendMessageIntent](https://developer.apple.com/documentation/sirikit/insendmessageintent)のみNotificationに追加できます。
Siriは提供されたIntentsを元に、ShortcutsやSuggestionを提供します。

# 4. Interruption levelsについて
[UNNotificationInterruptionLevel](https://developer.apple.com/documentation/usernotifications/unnotificationinterruptionlevel)で提供されるレベルは4つあります。

## 4.1. 各レベルについて
### 4.1.1. Passive(New!)
![スクリーンショット 2021-06-22 0.53.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453700/a28f51d7-4ec0-c239-e00e-2ae04a401a4e.png)
![スクリーンショット 2021-06-22 0.55.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453700/56583f8c-39b7-0b1e-86bb-fd647887d5bd.png)
notificationがデバイスに届いたとき、バイブレーションやサウンドを鳴らすことなく、
また画面が点灯することもないレベルです。
Notificationのリストにサイレントで配信され、ユーザーが次にリスト表示した時に見ることができます。
例えばおすすめの食事、新しいエピソードの配信など、いずれ見られるはずの通知で使用するのが良さそうです。

### 4.1.2. Active
![スクリーンショット 2021-06-22 0.55.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453700/d883695f-9c03-e9f4-a3f7-dd8285a17643.png)
![スクリーンショット 2021-06-22 0.55.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453700/e98ab0b2-4ce7-4ae2-ebf7-47e5df235d15.png)
デバイスに届いた時、サウンドを鳴らす、バイブレーションを行う、画面を点灯させるなど、
現行のnotificationに似ている挙動をします。
集中モードなどのシステム制御を突破することはありません。
UNNotificationInterruptionLevelのdefaultはこの値になります。
例えばスポーツ速報や、ライブストリームビデオの通知など、集中モードなどをわざわざ中断する必要のないnotificationに使用するのが良さそうです。

### 4.1.3. Time Sensitive(New!)
![スクリーンショット 2021-06-22 1.02.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453700/c3f00cf7-081e-6624-e041-45414d1d4e53.png)
基本的にはActiveと同様の動作をしますが、許可されていれば、集中モードなどの制御を突破することが可能です。
例えばアカウントのセキュリティ、荷物の配達などすぐに注意を払う必要があり、
積極的に中断することが適切な場合に使用を検討するのがよさそうです。
このレベルを有効にするためには、Capabilitiesで有効にする必要があります。

### 4.1.4 Critical
![スクリーンショット 2021-06-22 1.10.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453700/1cc8bcd0-afbe-a818-b9f4-7e2752d44eb3.png)
既に存在するCriticalなnotificationのサポート相当のものです。
積極的に警告し、集中モードなどの制御も突破します。さらに、デバイスの消音ボタンすらも突破します。
このnotificationを配信するには、Appleに承認されたentitlementsが必要となります。
悪天候や地域の安全性に関するアラートなど、用途をしっかり考えて配信する必要がありそうです。

## 4.2. レベルの設定方法
notificationにInterruption Levelsを設定するには、下記の方法があります。

![スクリーンショット 2021-06-22 1.13.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453700/e7cfc912-ae22-7824-dca0-e3efe8014a13.png)
UNMutableNotificationContentのinterruptionLevelにlevelを設定します。

![スクリーンショット 2021-06-22 1.14.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453700/b0d70b02-51cc-0ff4-5d26-becb51ef9c26.png)
ペイロードに設定する場合は、新しくkeyの"interruption-level"に値を設定します。

また、4.1.でも述べましたが、Time SensitiveではCapabilitiesを有効にする必要があり、
CriticalではAppleに承認されたentitlementsを必要とします。

# 5. 最後に
いかがでしたでしょうか。今回notification周りでかなり変更が入った印象を自分は受けております。

notificationは便利な一方で、適切ではない配信はこれまでもユーザーからは求められていないケースがあったことも事実だと思います。

iOS 15が配信された後では、集中モードがどんどん設定されていくことが予想されますが、
その中で適切なレベルのnotificationを配信していくように考えていかなければ、ゆくゆくはユーザー満足度を下げ、appをアンインストールされることにも繋がりかねないと考えています。
一方で、Notification summaryでまとめて配信された場合に、どのようにユーザーにnotificationに気がついてもらうかを考えていかなければ、適切なレベルで配信を行った時にも埋もれてしまう可能性もあると思います。

iOS 15が配信されるまでに、iOS 15への最適化のスケジュールを検討し、
チームで適切なnotificationの配信方法について議論する必要がありそうです。

Human Interface Guidelineで公開されている下記の項目もよく読み込んでいきたいと思っています。

[・Notifications](https://developer.apple.com/design/human-interface-guidelines/ios/system-capabilities/notifications/)

# 6. 参考
[・Send communication and Time Sensitive notifications](https://developer.apple.com/wwdc21/10091)