MattermostでiOS/Androidクライアントにpush通知

宗教上の理由でAndroid端末を持っていなかったのですが、Kindle Fire(第5世代)が手に入りましたので、push通知を確認してみました。
公式ドキュメントの記述も結構分散しているので、簡単にまとめておきます。

需要があるか正直わかりませんが、皆様の世知辛いMattermost生活の一助になれば幸いです。

# はじめに

Mattermost(v2.1.0)のpush通知は以下の２パターンを想定しているようです。
http://docs.mattermost.com/deployment/push.html#configuration-options-for-push-notifications

## A. 自分でビルドしたiOS/Androidアプリと、自分で設置したpush通知サーバ(push-proxy)を利用

1. iOS端末
    2. [APNs証明書](http://qiita.com/itosho/items/869f179ffda939a267fd)を取得
    3. 1.を使ってpush通知が使えるように[mattermost/ios](https://github.com/mattermost/ios)をビルド
    4. iOS端末に配布／インストール
2. Android端末
    1. [Google Cloud Console](https://cloud.google.com/console)からGoogle Cloud Messaging(GCM)のAPIキーを取得
    2. 1.を使ってpush通知が使えるように[mattermost/android](https://github.com/mattermost/android)をビルド
    3. Android端末に配布／インストール
3. push通知サーバ(push-proxy)
    1. サーバを用意し、[mattermost/push-proxy](https://github.com/mattermost/push-proxy)をダウンロード
    2. `config/config-push-proxy.json`にAPNsの証明書/AndroidのAPIキーを設定
    3. [起動、動作確認](https://github.com/mattermost/push-proxy#installation)

正直かなりハードルが高いと感じたので、今回はこちらの方法では確認しておりません。
ネイティブアプリ関係の開発をされていて興味がある方、ぜひ試してみて知見を共有いただければ…

### :+1: メリット

* 基本料金無料
* Mattermost本体／push通知サーバ／各ネイティブアプリ のバージョンを完全にコントロールできる
  * Mattermostのように若いプロダクトの場合、特に魅力的かもしれません

### :-1: デメリット

* ネイティブアプリのビルド、および配布作業が大変
    * iOS/Androidをソースコードからビルドできる技術と、push通知関係についても充分な知識が必要
       * 僕はこっち側がさっぱりなので諦めました… 
       * アプリ開発をメインでやっていて、既に環境がそろっているとかでないと正直厳しいのでは…
    * iOS端末で利用する場合、APNs証明書の取得にAppleへのお布施([Apple Developer Networkへの加入](https://developer.apple.com/programs/jp/))が必要なので、完全無料にはならない
* push通知サーバ(mattermost-proxy)の管理も必要
    * Mattermostサーバをverupした場合、 通知サーバ(mattermost-proxy)もあわせてverupする必要がある
    * ある程度後方互換はありそうなんですが、まだ若いプロダクトなのでなんとも…


## B. 公式から提供されているiOS/Androidアプリと、公式の提供するpush通知サービス(MHPNS)を利用

A.の1～3を、Mattermost公式が提供しているものを利用して代替する方法です。

1. iOS端末
    * [App Store経由でインストール](https://itunes.apple.com/jp/app/mattermost/id984966508?mt=8)
2. Android端末
    * [Play Store経由でインストール](https://play.google.com/store/apps/details?id=com.mattermost.mattermost&hl=jp)
3. push通知サーバ
    * MHPNSの[利用申込をして発行してもらう？](https://about.mattermost.com/pre-compiled/)
        * 今回はテスト用urlを利用

### :+1: メリット

* 楽
  * push通知用サーバのセットアップやバージョン管理をしなくていい
  * 各ネイティブアプリのビルドやバージョン管理をしなくていい（ストア経由で自動更新できる）

### :-1: デメリット

* 無課金厨に不評（世知辛い）
* [MHPNSの値段がいくらなのかわからない](https://about.mattermost.com/pre-compiled/)
  * MLに加入しないとわからない？　ので確認するのも二の足踏んでしまいました…  
      * お仕事で利用される方は、ぜひ知見を展開いただきたく…
      * というか本当に商用ローンチされてるのかな…
* MHPNSがMattermostの最新版にしか対応しない方針の場合、運用しているMattermostのバージョンを常に最新に保つ必要がある
  * Mattermostのリリーススケジュールが毎月16日で更新もかなり活発なので、追従するとなると結構大変かも…

というわけで、本記事では B. の方法で確認していきます。
ちなみに、Mattermostサーバ自体は直接インターネットからアクセスできない環境でも問題ありません。

# 確認手順

## 事前準備

Mattermostサーバは [terukizm/mattermost-vagrant](https://github.com/terukizm/mattermost-vagrant) を利用して構築したものです。

仮想マシン上で動いているので、以下のようにして

```:Vagrantfile
config.vm.network "forwarded_port", guest: 80, host: 38080
```

WiFi接続してあるiOS/Android端末から、LAN経由でアクセスできるようにしてあります。


### Mattermostサーバ

ブラウザ経由で以下の作業を行っておきます。

1. teamを作成、teamURLをメモ 
2. push通知テスト用のchannelを作成(「テストPush通知部屋」)
3. ios用アカウント(@iosnative)、android用アカウントを作成(@android)

### iOS端末

au iPhone 6S(iOS 9.2.1)で確認。
Apple Store経由でMattermostクライアントを導入。

### Android端末

Kindle Fire(Android 5.1.1)で確認。
Play Store経由でMattermostクライアントを導入。


## 作業手順

### 1. Mattermostサーバにpush通知の設定を行う

「System Console」 → 「Email Settings」 から以下のように設定します。

* 「Send Push Notifications」: true
* 「Push Notification Server」 : http://push-test.mattermost.com
    * 確認用に用意されているサーバなので叩き過ぎると怒られるかもしれません… テスト時はご配慮ください…

<img src="https://qiita-image-store.s3.amazonaws.com/0/50184/67675158-66fc-a7eb-cdba-1c80f35f2ff1.png" width="1000px">

### 2. 各端末からログイン

1. teamURL、アカウント名／パスワードを入力してログイン
2. **Mattermostクライアントを終了** [^1] 
3. **5分待つ** [^2]

特に **太字部分** に気をつけてください。[ドキュメントに書いてあった](http://docs.mattermost.com/administration/config-settings.html#troubleshooting-push-notifications)のですが、完全に読み飛ばしていてハマりました…

[^1]: 端末からのMattermostサーバへの接続が生きているとpush通知が飛んでこないようです。(バックグラウンドでアプリが起動していたり、モバイルブラウザからログインしているとNG）
[^2]: ログイン時に端末IDをNotification Serverにひも付けており、そのタスクが5分毎で処理されているとかなんですかね。

### 3. 各端末のアカウントに向けてDirect Messageを送る

他のユーザ[^3]からDirectMessageを送信します。このDM以後、push通知が行われるようになるみたいです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/50184/12da4950-fdf5-8891-7a60-d0958357be30.png" width="1000px">

こんな感じで通知がくればOK。 [^4]

[^3]: ここではたまたまrootを使っていますが、Admin権限のユーザである必要はありません。
[^4]: スクリーンショットが取りづらかったので通知形式は変更してあります。デフォルトはバナー方式です。


<img width="375" src="https://qiita-image-store.s3.amazonaws.com/0/50184/3d688e22-79ef-246a-fb7d-7f55bff2fda2.png">

Androidの場合はこんな感じ。

<img width="450" src="https://qiita-image-store.s3.amazonaws.com/0/50184/7c58dcba-339b-f6e3-bedf-a7ef174228c0.png">


### 4. 各端末のアカウントに向けてReplyを送る

ここでは「テストPush通知部屋」の中からReplyを送ってみます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/50184/c03dc535-9fb7-e081-fa9a-fe8b30a1f836.png" width="1000px">

こんな感じで通知がくればOKです。

<img width="375" src="https://qiita-image-store.s3.amazonaws.com/0/50184/cb3e7ab3-c4c8-c9bc-0191-1f1f8b9dbe25.png">
<img width="450" src="https://qiita-image-store.s3.amazonaws.com/0/50184/73abda69-35fb-8be4-ee9f-19258e025a97.png">


遅延についてはほとんど感じられず、ほぼリアルタイムで通知されている印象でした。

メッセージの中身が表示されないのは、閉じた環境から使われることを想定し、情報が流出しないように、という配慮なんですかね。 [^5]
実際の内容はアプリを起動して確認する感じになります。

[^5]: Mattermostからpush通知サーバへのリクエストにメッセージの内容は含まれない仕様なのではないかと思います。ソースコード読んだわけではないので、実際にお仕事で使われる場合はあらかじめご確認ください。


以上、皆様の世知辛く充実したMattermost生活に潤いがもたらされることを、心よりお祈り申し上げます。

----