iOSのNotificationのおさらいとiOS10での新機能

#Notificationとは

Notificationとは、ローカル、またはリモートから送信されるデータに基づき発火する、ユーザに様々な方法を用いて情報の通知を行うシステムのことです。
- 視覚的表示
- 通知音とバイブレーション
- アプリアイコンのバッジ

![スクリーンショット 2016-06-27 14.04.40-1.png](https://qiita-image-store.s3.amazonaws.com/0/36042/e079849f-dc19-6129-f7e1-c146ea7cc10e.png "スクリーンショット 2016-06-27 14.04.40-1.png")


Notificationはユーザのデバイスの状態によって通知方法が違います。
デバイスがロック解除されている場合はバナー、ロックされている場合はロックスクリーンに、もしユーザがNotificationを見逃してしまった場合は
Notification Centerに表示されます。

![スクリーンショット 2016-06-27 14.05.53-1.png](https://qiita-image-store.s3.amazonaws.com/0/36042/1f3cc688-2451-0f12-c169-5d09b110dd34.png "スクリーンショット 2016-06-27 14.05.53-1.png")


#2つのNotification

NotificationはLocal NotificationとRemote Notificationの2つが存在します。

##Local Notification

Local Notificationはアプリが予め定められた条件に基づいて発火します。時間発火やユーザの位置情報に基づいた発火が多いです。
AppがシステムにNotificationを予約し、システムがNotificationを表示させ、ユーザがそれをタップするとアプリがCallbackを受けます。

- タスクリマインダー
- カレンダー（時間に基づく）
- 位置情報に基づく

などで発火することが多いです。
なお、watchOS3では単体でもLocal Notificationが可能になりました

##Remote Notification

Remote NotificationはAPNSから送信されます。アプリ開発者のサーバからAPNSにNotification送信が予約され、
APNSがベストエフォートでユーザのデバイスのシステムに通知を予約し、システムがNotificationを表示させ、ユーザがそれをタップするとアプリがCallbackを受けます。 
Remote Notificationにも2つのタイプのNotificationがあり、User-facing Notificationと、Silent update Notificationです。

###User-facing Notification
普通のNotificationと同じように、ユーザに情報を通知するためのNotificationです。

###Silent update Notification
このNotificationは普通のNotificationではなく、ユーザではなくアプリを起こしてバックグラウンドで通信を行わせるために使われる通知です。
コレを使うことによってアプリを起こして、サーバから新しい情報を撮ってきてアプリ内の情報を最新に保ったりできます。 

#User Notifications Framework
iOS10から追加された、既存のNotificationの実装の冗長性や、新機能追加のために、Notificationが新しくFrameworkとして切り出されました。
特徴として、

- 既存のAPIと酷似した形で提供
- 通知コンテンツを拡張できる
- Local NotificationとRemote Notificationは別のコールバックを受けていたが、同じようにハンドリングできるように
- delegateメソッドが簡素化
- Notificationのマネジメントが協力に
- アプリがフォアグランドでも通知されるように
- Notifcation Extension


#Notificationを送信する

Notificationを送信するには下記のようなステップが必要です

1. 設定、許可を取る
2. 表示コンテンツを作成する
3. トリガーを設定する


##Notificationの設定

Notificationを送信するには、まずユーザのPermission（許可）が必要です。
そして、Permissionを取るタイミングは、ユーザがNotificationを受け取りそうな直前のタイミングが最も適しています。
Permissionを取る画面には開発者のコメントが記述でき、なぜそのPermissionを取得するのか、どのように使うのかを記載することができ、
ユーザの心象を良くすることが可能です。
また、ユーザは設定でいつでもNotificationの許可設定を変更することが可能です。
iOS10からアプリで、現在のNotificationの設定を取得することができるようになりました。

##表示コンテンツを作成する

iOS10からこのように表示できるようになりました。

![スクリーンショット 2016-06-27 14.50.08-1.png](https://qiita-image-store.s3.amazonaws.com/0/36042/40a1b1db-ec57-c236-e0a7-ffd3536728b0.png "スクリーンショット 2016-06-27 14.50.08-1.png")

- タイトル：Notificationにタイトルを付けることが可能になりました
- Subtitle：Notificationにサブタイトルをつけることが可能になりました
- Body：これはiOS9以前からの、本文のことです

##トリガーを設定する

iOS10では下記の4つの方法でNotificationのトリガーを設定できるようになりました

- Push（Remote Notification）
- 時間インターバル
- 日次
- 位置情報、もしくはiBeaconのregion

#Notificationを管理する

iOS10ではNotification Managementという機能が加わり、Notificationを管理することが可能になりました。
つまり、一度スケジューリングされたNotificaitonをキャンセルしたり、すでに送信されたNotificationをアプリが認識したりすることが可能です。
例えば、スポーツの試合の開始をNotificationで通知するようにスケジュールしたが、試合が中止になった際、
この機能を使ってスケジュールされたNotificationをキャンセルすることができます。 
もしくは、試合時間が変更になった際に、再スケジュールしたり、内容を変更することがすることができます。
通常なら、アップデートが合った場合、2通のNotificationを送信しますが、1通目のNotificationの情報を変更して再送信することができます。
つまり下記のようなことです。
![スクリーンショット 2016-06-27 15.07.38-1.png](https://qiita-image-store.s3.amazonaws.com/0/36042/30d89898-3910-f650-9f05-dd00a3e3b236.png "スクリーンショット 2016-06-27 15.07.38-1.png") ![スクリーンショット 2016-06-27 15.08.38-1.png](https://qiita-image-store.s3.amazonaws.com/0/36042/56cd6f7d-5454-5270-5a14-3194957abef6.png "スクリーンショット 2016-06-27 15.08.38-1.png")


（TeamBのスコアに注目）

2通目を送るのではなく、1通目のスコアが変更され、通知が上に来ています。

#Notificationのアクション
ユーザはNotificationに対して下記3つのが可能。なお、User Notification Frameworkによって実装方法が簡易化された。

##Default Action
Notificationにタップするとアプリが開く。ロックスクリーンの場合はスワイプして開く。
Notification CenterのNotificationをタップしてもアプリが開く。

##Custom Action
Actionable Action(iOS8〜)を使って、ボタンなどを表示させてNotificationからそのまま、アプリを開かずに反応ができる。
iOS9からはテキストを返信することも可能。
![スクリーンショット 2016-06-27 15.45.40-1.png](https://qiita-image-store.s3.amazonaws.com/0/36042/6a2a1938-0a26-b9e9-2590-29885d6ff140.png "スクリーンショット 2016-06-27 15.45.40-1.png")


##Dismiss Action
iOS10で新しく出来た方式。
Notificationを削除することができるようになった。 設定をすることによってCallbackを受けることが可能。

#NotificationのUI
iOS10からの新しい概念。

##Media Attachment
アプリなどを開かなくても画像や動画などを表示することができる。
Service Extentionを使って、指定したリソースのURLなどをダウンロードする。 
画像(animated gifも含む)、音声、動画をサポート。
しかし、Service Extentionが処理できる時間、もしくはダウンロードできる容量が小さいため、
 Notification用のメディアを用意する方が良い。
 
##Custom UI(Notification Content Extension)
![スクリーンショット 2016-06-27 17.20.09-1.png](https://qiita-image-store.s3.amazonaws.com/0/36042/e061df3e-a559-bb3f-3278-45bffacacc09.png "スクリーンショット 2016-06-27 17.20.09-1.png") ![スクリーンショット 2016-06-27 17.19.51-1.png](https://qiita-image-store.s3.amazonaws.com/0/36042/763551b8-a1d6-9082-b158-60e79c8c443a.png "スクリーンショット 2016-06-27 17.19.51-1.png")

このようにUIを用いてユーザに詳細情報を表示することができる。しかしカテゴリが指定されている。
しかしUIはタッチイベントなどは取得できない。しかしActionable Notificationを用いることで
Notification自体にはアクションすることが可能、かつ、Custom UI部分の表示もアップデートすることが可能。
ヘッダー部分、Custom UI、デフォルトUI（文章）、Action(Actionable Notificationの場合)の3(4)部分に分かれる。
なお、info.plistを編集することでデフォルトUIを消すこともできる。 

#Notification Service Extension
iOS10での新機能。ユーザに通知がなされる前に、Notificationを処理、UIを作成、指定されたリソースのダウンロードなどができる。
NotificationのUIをいじったりするのに必要。 
![スクリーンショット 2016-06-27 17.25.41-1.png](https://qiita-image-store.s3.amazonaws.com/0/36042/b1df5704-d29e-9a2f-772e-735e8dfdfe62.png "スクリーンショット 2016-06-27 17.25.41-1.png")


こういう関係。Service Workerを知っているひとは、それに近い感覚。

#参考文献
https://developer.apple.com/videos/play/wwdc2016/707/
https://developer.apple.com/videos/play/wwdc2016/708/