iOS 10 の Push通知 / ローカル通知 でできること

記事の内容はこちらを参照してください。
https://mishimay.github.io/9451b85982e2288ee4aa/
<!--

iOS 10 から通知に関する2つのフレームワークが追加されます。

- [UserNotifications](https://developer.apple.com/reference/usernotifications)
- [UserNotificationsUI](https://developer.apple.com/reference/usernotificationsui)

これらを使って新たにできるようになることをまとめました。


# タイトル、サブタイトル、本文の3種類の文字列を表示できる

![Screen Shot 2016-06-20 at 9.50.22 AM.png](https://qiita-image-store.s3.amazonaws.com/0/23679/bce8a14f-12ef-dcb4-8a26-776d27255a38.png)
(画像は[WWDCセッション](https://developer.apple.com/videos/play/wwdc2016/707/)より)

- ~~今までは表示する文字列に種別はなかった~~
- 新たにサブタイトル (`subtitle`) を指定できるようになった 
  - タイトル (`title`) は iOS 8.2 から指定可能 (ただし表示されない場合があるらしい)
  - cf. [iOS 10などで使えるようになるUserNotificationsフレームワークへの所感 \- Qiita](http://qiita.com/mono0926/items/1fdf9ce8d1de0e30012b#apns-%E3%83%9A%E3%82%A4%E3%83%AD%E3%83%BC%E3%83%89%E3%81%AE%E5%A4%89%E6%9B%B4)


# メディアを添付できる (Media Attachments)

![Screen Shot 2016-06-20 at 9.55.06 AM.png](https://qiita-image-store.s3.amazonaws.com/0/23679/31d41e15-9afc-bf6a-d5e3-8c3740bc9197.png)
(画像は[WWDCセッション](https://developer.apple.com/videos/play/wwdc2016/708/)より)

- 画像、動画、音声 が指定可能
- Forceタッチで拡大表示
- メディアのURLを指定する
  - [UNNotificationAttachment](https://developer.apple.com/reference/usernotifications/unnotificationattachment) にURL指定
  - メインBundle内のメディアも可
  - Push通知の場合はまずメディアのURLを端末に通知し、後述する [Notification Service Extension](https://developer.apple.com/reference/usernotifications/unnotificationserviceextension) を使ってURLを取り出してから [UNNotificationAttachment](https://developer.apple.com/reference/usernotifications/unnotificationattachment) に指定する必要あり
  - より詳しく: [iOS 10 で画像つきの Notification を配信する - Qiita](http://qiita.com/himara2/items/dcfcc30b550c3304d86a)

    ```swift
    public class NotificationService: UNNotificationServiceExtension {
        override public func didReceive(_ request: UNNotificationRequest, 
                withContentHandler contentHandler: (UNNotificationContent) -> Void) {

            let fileURL = // ...

            let attachment = UNNotificationAttachment(identifier: "image", 
                                                      url: fileURL, 
                                                      options: nil)

            let content = request.content.mutableCopy as! UNMutableNotificationContent
            content.attachments = [ attachment ]

            contentHandler(content)
        }
    }
    ```
    (コードは[WWDCセッション](https://developer.apple.com/videos/play/wwdc2016/708/)より)

- メディアの処理時間とファイルサイズに制限がある
  - ファイルサイズについては [UNNotificationAttachment](https://developer.apple.com/reference/usernotifications/unnotificationattachment) に記述あり


# 通知条件を細かく設定できる
- Push通知で任意のタイミングで
- ローカル通知
  - 時間間隔を指定 (リピート設定可)
  - 日時を指定 (リピート設定可   i.e. 指定したDateComponentsに一致したら何度でも)
  - 位置情報を指定


# フォアグラウンドでシステムの通知を表示できる
- 今まではアプリがフォアグラウンドだと、そのアプリの通知が届いてもシステムが通知を表示してくれなかった
  - そのため通知を受け取ったら独自のAlertを表示するなどの実装が必要だった
- 表示する通知の内容を設定できる 
  - alert, sound, badge のうち表示したいものだけを指定できる

```swift
func userNotificationCenter(_ center: UNUserNotificationCenter,
                            willPresent notification: UNNotification,
                            withCompletionHandler handlerBlock:
                                (UNNotificationPresentationOptions) -> Void) {
    // Roll banner and sound alert
    handlerBlock([.alert, .sound])
}
```
(コードは[WWDCセッション](https://developer.apple.com/videos/play/wwdc2016/707/)より)


# 一度登録した通知を更新できる
- 未配信/配信済みいずれの通知も操作可能
- 配信済みで通知センターに表示されている通知を更新した場合、通知センターの表示も更新される


# Push通知を受け取ってから表示するまでの間に通知データを操作できる
- 例えば、暗号化したメッセージをPush通知し、端末で復号することで end-to-end の暗号化が可能になる

- Extensionを追加して実装
  - [Notification Service Extension](https://developer.apple.com/reference/usernotifications/unnotificationserviceextension)


# カスタムUIを作成できる

![Screen Shot 2016-06-20 at 10.01.55 AM.png](https://qiita-image-store.s3.amazonaws.com/0/23679/638180ac-f991-ae2c-cd98-c37c7c9a6a09.png)
(画像は[WWDCセッション](https://developer.apple.com/videos/play/wwdc2016/708/)より)
*薄い灰色の背景の部分がカスタムUIで、自由にレイアウトできる*

- リッチ通知 (Rich Notification) と呼ばれるもの
- 通知をForceタッチすると表示される
  - ~~3Dタッチに対応していないデバイスでも可能になる？ ([iOS 10 rich notifications will come to devices without 3D Touch, Apple tells developers](http://appleinsider.com/articles/16/06/14/ios-10-rich-notifications-will-come-to-devices-without-3d-touch-apple-tells-developers))~~
  - 3Dタッチ未対応端末の場合
      - *ロック画面、通知一覧画面*： 左へスワイプ -> 「表示」をタップ
      - *画面上部に通知が来た場合*： 下へ引き下げる
- インタラクションは**不可**
- キーボードを表示させてテキスト入力させることは可能
  - テキスト入力した後にViewを更新して入力されたテキストを表示できる
- 通知に付随する「アクションボタン」の表示、押下は可能
- Info.plist に以下の設定項目がある
  - `UNNotificationExtensionInitialContentSizeRatio`
      - カスタムUIの縦横比
  - `UNNotificationExtensionDefaultContentHidden`
      - カスタムUIと一緒に、タイトル/サブタイトル/ボディ/メディアから成る通常の通知を表示するかどうか

- Extensionを追加して実装
  - [Notification Content Extension](https://developer.apple.com/reference/usernotificationsui/unnotificationcontentextension)

# 通知設定にアクセスできる

```swift
UNUserNotificationCenter.current().getNotificationSettings { (settings) in // ... }
```
(コードは[WWDCセッション](https://developer.apple.com/videos/play/wwdc2016/707/)より)

- アプリ内から通知に関するさまざまな設定にアクセスできる
  - e.g. 通知許可設定
- 取得できる設定情報の詳細についてはドキュメントを参照のこと
  - [getNotificationSettings(completionHandler:) - Apple Developer Documentation](https://developer.apple.com/reference/usernotifications/unusernotificationcenter/1649524-getnotificationsettings)
- より詳しく: [iOS 10でついに通知許可ダイアログの操作をハンドリングできるようになったよ - Qiita](http://qiita.com/tokorom/items/6c6864fa8e841e50e37b)


# 参考
WWDC

- [Introduction to Notifications - WWDC 2016 - Videos - Apple Developer](https://developer.apple.com/videos/play/wwdc2016/707/)
- [Advanced Notifications - WWDC 2016 - Videos - Apple Developer](https://developer.apple.com/videos/play/wwdc2016/708/)

ドキュメント

- [UserNotifications - Apple Developer Documentation](https://developer.apple.com/reference/usernotifications)
- [UserNotificationsUI - Apple Developer Documentation](https://developer.apple.com/reference/usernotificationsui)

解説

- [New in Notifications](http://fichek.com/blog/wwdc16-notifications/)



-->