iOS10のプッシュ通知の見た目＆操作まとめ


[iOS Creators' Meetup vol.2](https://oi-study.connpass.com/event/40049/)で発表した内容ですが、[iOS Creators' Meetup vol.3](https://oi-study.connpass.com/event/48050/)に参加して思い出したので公開します。

内容的には「iOS10になってからiOSのプッシュ通知もだいぶリッチになったのでいろいろ触ってみました」でした。

# プッシュ通知の操作まとめ

まずは基本的なメッセージを送ったときの見た目を見ていきましょう。
新しいところとしてはアプリがアクティブな状態で通知を表示するということもできるようになりました。

プッシュ通知が表示されるのは下記のようなシーンですが、（イケてないことに）似たような操作をするのにシーンごとに操作が異なるのでまとめました。

ここでは特にプッシュ通知を「開く」という操作に注目です。

||ロック画面|ホーム画面|アプリ画面|通知センター|
|---|---|---|---|---|
|見た目|![IMG_8678.PNG](https://qiita-image-store.s3.amazonaws.com/0/8868/f94b5f5f-579d-1009-3639-dc02569a63de.png "IMG_8678.PNG")|![IMG_8674.PNG](https://qiita-image-store.s3.amazonaws.com/0/8868/859792d8-9a9b-a78d-4852-81fedc45007c.png "IMG_8674.PNG")|![IMG_8681.PNG](https://qiita-image-store.s3.amazonaws.com/0/8868/da8666c7-c2ef-eef4-d4d9-7519adda7966.png "IMG_8681.PNG")|![IMG_8682.PNG](https://qiita-image-store.s3.amazonaws.com/0/8868/fb3d3a1f-e639-bbff-dad5-594694d8a81e.png "IMG_8682.PNG")
|
|アプリ起動|右スワイプ|タップ|-|タップ|
|プッシュ開く|3Dタッチor左スワイプしてView|下スワイプ|下スワイプ|3Dタッチor左スワイプしてView|
|プッシュ消す|左スワイプしてClear|上スワイプ|上スワイプ|xボタンタップor左スワイプしてClear|

## プッシュ通知を開く

プッシュ通知を開くという操作をすることで今までの「プッシュ通知->アプリ起動」だった動線に加えて「プッシュ通知->通知を開いて表示->アプリ起動」という動線も増えました。

例えば、ロック画面でプッシュ通知を受け取った際に通知を3Dタッチ通知すると背景にブラーがかかって通知がフォーカスされます（これをプッシュ通知と開くと呼んでいますが、正式にはなんて言えばいいんすかね？）。通常のプッシュ通知であれば開く意味を感じませんんが、iOS8からのアクション実行型プッシュ通知や、iOS10から登場したリッチ通知を用いるといろいろな表現ができるようになっています。（※ちなみに私はいまだにiPhone5sが主武装なので左スワイプしないと開けなくてあまりいいユーザー体験できてません。3DタッチできるようになったのはiPhone6s以降ですかね。）

|プッシュ通知受信|通知を左スワイプ|開いた後の見た目|
|---|---|---|
|![IMG_8678.PNG](https://qiita-image-store.s3.amazonaws.com/0/8868/1cd0d2f6-9958-3191-a0a9-b27c9101cd7d.png "IMG_8678.PNG")|![IMG_8679.PNG](https://qiita-image-store.s3.amazonaws.com/0/8868/24dc14aa-98a0-3c02-d44b-a30bdc4e3e18.png "IMG_8679.PNG")|![IMG_8680.PNG](https://qiita-image-store.s3.amazonaws.com/0/8868/e9f5273b-f2dc-cabc-d2dd-a73e1c9f5ed3.png "IMG_8680.PNG")|


# プッシュ通知の見た目＆ペイロードまとめ

## 本文のみ

文言だけの最も基本的なプッシュ通知です。多くのプッシュ通知はこんな感じですね。

![IMG_8680.PNG](https://qiita-image-store.s3.amazonaws.com/0/8868/e9f5273b-f2dc-cabc-d2dd-a73e1c9f5ed3.png "IMG_8680.PNG")

iOSのプッシュ通知のペイロードで特殊な機能があるものは`aps`の中に設定していきます。メッセージの文言は`alert`に設定します。

```JSON
{
  "aps": {
    "alert": "プッシュ通知だよ"
  }
}
```

## タイトルをつける

プッシュ通知にはタイトル（iOS8.2〜）、サブタイトル（iOS10〜）が付けられます。

![IMG_8684.PNG](https://qiita-image-store.s3.amazonaws.com/0/8868/cb502706-a812-8c41-4c60-620a0970b0bb.png "IMG_8684.PNG")

本文のみのときは`alert`に文字列を指定していましたが、入れ子にして`title`, `subtitle`, `body`にそれぞれタイトル、サブタイトル、本文の文字列を設定すればOKです。

```JSON
{
  "aps": {
    "alert": {
      "title": "プッシュ通知タイトル",
      "subtitle": "プッシュ通知サブタイトル",
      "body": "プッシュ通知本文"
    }
  }
}
```

## カスタム警告音をつける

プッシュ通知を受信したときの音声を変える場合は`sound`に音声ファイル名を指定します。鳴らす音声はあらかじめアプリのバンドルに含めておきましょう。けっこうマナーモードにしっぱなしの人もいるようですがプッシュ通知の音だけで「あ、あのアプリからプッシュ通知が来た！」ってわかったもらえるようになると素敵ですね。

```JSON
{
  "aps": {
    "alert": "カスタムサウンド",
    "sound": "levelup.mp3"
  }
}
```

## バッジ

プッシュ通知を送信して下記のようにアプリアイコンにバッジを設定することもできます。

![8b46f296-7cb2-1764-b09b-64428df66c87.png](https://qiita-image-store.s3.amazonaws.com/0/8868/590bd24e-4d6f-eba0-0820-88fe1a1831ed.png "8b46f296-7cb2-1764-b09b-64428df66c87.png")

バッジは`badge`に表示したい数値を入れます。表示するだけで勝手に消えるというようなことはないのでアプリ側にバッジを消す処理などは入れておきましょう。ちなみに`badge`に0を設定してバッジを消すこともできます。

```JSON
{
  "aps":{
    "alert": "バッジだよー",
    "badge": 1
  }
}
```

## アクション実行型プッシュ通知

プッシュ通知から特定のアクションを実行することができるプッシュ通知です。iOS8から登場していますがiOS10でかなり使いやすくなったようになった気がします。LineやFacebookメッセージなどはメッセージ受信のプッシュ通知から返信したりスタンプを送ったりできます。

![IMG_8685.PNG](https://qiita-image-store.s3.amazonaws.com/0/8868/73e7dbd5-bb88-788e-95f8-1180deae05ff.png "IMG_8685.PNG")

実行できるアクションには「iPhoneのロック解除が必要なもの」「ロック解除しなくても処理できるもの」「破壊的な処理が行われるもの（削除とか）」の３タイプあり、破壊的な処理が行われるアクションに指定したものは赤い文字で表示されます。

アクションに対応する処理はあらかじめアプリ側に実装しておく必要があり、プッシュ通知でどのアクションを表示させるかを`category`で指定する形で利用します。（※実装についてはいつか書く）

なのでJSONペイロードだけみると`category`にカテゴリーの文字列を設定するだけです。

```JSON
{
    "aps" : {
        "alert" : "アンケートのご協力をお願いします！",
        "category" : "ACTION_CATEGORY"
    }
}
```

## リッチ通知（メディア添付）

iOS10から画像（GIFアニメ含む）や動画、音声をプッシュ通知に表示することができるようになりました。画像や動画付きのプッシュ通知を受け取ると下記のようにサムネイル付きのプッシュ通知として表示されます。

![IMG_9133.png](https://qiita-image-store.s3.amazonaws.com/0/8868/26eef9e7-44cb-9a7b-6fd8-56b77705ec38.png "IMG_9133.png")


それぞれプッシュ通知を開いた状態では下記のような見た目になります。音声、動画は再生マークの部分をタップすると再生することができます。

|画像|音楽|動画|
|---|---|---|
|![IMG_9130.PNG](https://qiita-image-store.s3.amazonaws.com/0/8868/68407f75-ed40-7e9f-0b24-ce6114df8f47.png "IMG_9130.PNG")|![IMG_9131.PNG](https://qiita-image-store.s3.amazonaws.com/0/8868/3af71d79-655f-08cb-f468-159154d9252f.png "IMG_9131.PNG")|![IMG_9132.PNG](https://qiita-image-store.s3.amazonaws.com/0/8868/6af6c8fb-550f-6683-a614-e111065882f4.png "IMG_9132.PNG")|

もっともお手軽に活用できるのはGIFアニメ付きのプッシュ通知でしょうか。添付する画像をGIFアニメにするだけで、例えば下記のようなプッシュ通知を実現することができます。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ステマ <a href="https://t.co/z77UiUBAP3">pic.twitter.com/z77UiUBAP3</a></p>&mdash; hideyuki nanashima (@jollyjoester) <a href="https://twitter.com/jollyjoester/status/820665417983139840">2017年1月15日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

メディア付きのリッチ通知を実現するには`NotificationServiceExtension`というものを実装する必要があります。詳しくは[プッシュ通知を究める！その②〜リッチ通知（メディア付き）の実装の仕方〜](http://qiita.com/jollyjoester/items/70bc862c64384de8b082)に記載していますのでご参考まで。

ちなみにiOS9以下ではメディアなしの通常のプッシュ通知として表示されます。

JSONのポイントは`mutable-content: 1`を含めるという点とメディアのURLを含める点です。`aps`の外側のフォーマットは自由なのでアプリの実装に合わせて決めてみてください。

```JSON
{
  "aps": {
    "alert": "メディア付きリッチ通知だよ",
    "mutable-content": 1
  },
  "notification-data": {
    "attachment-url": "メディアのURL"
  }
}
```

## リッチ通知（カスタムUI）

同じくiOS10からUIViewを使ったカスタムUIを表示できるプッシュ通知も送信できるようになりました。例えば下記はプッシュ通知を開いた際にひたすら🍣の絵文字のUILabelが右から左にアニメーションするカスタムUIを添付したプッシュ通知です。このように自由なUIをプッシュ通知で実現することができます。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">また🍣を眺めてる <a href="https://t.co/AKwe6AKn9t">pic.twitter.com/AKwe6AKn9t</a></p>&mdash; hideyuki nanashima (@jollyjoester) <a href="https://twitter.com/jollyjoester/status/821036212785913856">2017年1月16日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

カスタムUI付きのリッチ通知を実現するには`NotificationContentExtension`というものを実装する必要があります。詳しくはいずれ書きますが、プッシュ通知に表示するUIをStoryboardを使うなどして通常の画面と同じように実装することができます。

JSONのポイントは`category`です。`NotificationContentExtension`の`Info.plist`に`category`を設定する項目があるのでそれと同じ`category`を送信します。

```JSON
{
  "aps": {
    "alert": "カスタムUI付きリッチ通知だよ",
    "category": "myNotificationCategory"
  }
}
```

# おわりに

以上、まとめてみました。
プッシュ通知でもかなりいろいろなことができるので楽しんで見てください。
プッシュ通知の効果的な使い方、見せ方をしているアプリあるよっていう事例などあったらぜひ教えていただけると嬉しいです！