parse serverに移行してAPNS,GCM通知

これは2016/03/19時点での忘備録

Parse.comが2017/01終了、それに伴って徐々にクローズ時期が迫っているようなので移行の検討

https://github.com/ParsePlatform/parse-server/wiki/Migrating-an-Existing-Parse-App

asapですって。
2016/04/28 自前MongoDBにしなされ
2016/07/28 自前server用意してClientAppをverupしなされ
DBからちみちみと弱めていくような。

当方、parse.comは通知のみに使用していたので、これだけでも通ればというところだったのですが、当初parse serverでは通知は未対応。
ですが、気がつけば通知の対応も入ってきていたのでこれでいけるかなと。


parse serverは、node.js + MongoDB の構成。イマドキどこでも動きますね。
通知には 
node-apn https://github.com/argon/node-apn
node-gcm https://www.npmjs.com/package/node-gcm
を使用するようになっている模様。
これらはそれなりに使われているので問題なかろうかと。

サーバーは、tokenの受付、MongoDB、APNS,GCMへの送信が出来ればいいだけで、そんなに即時性もいらないので、そのあたりの要件を満たす程度のサーバーを用意。

仰々しく構えたいならAWSやAzure,GAP、DBにmLab,ObjectRocketなどを。
そこまで必要なレベルだったらそもそもparse.comなぞ使ってないと思われますが。

通知をAWS SNSにしたいならAdapterあたりを書き換えるかもう少し待てば出てくるかも。
とはいえSNSサーバーへアクセスするか、APNS,GCMサーバーへアクセスするかの違いでしか無くなってくるので、SNS使う必要があるかどうか分からないですが。


## インストール

https://github.com/ParsePlatform/parse-server

ページにある通りに、parse serverとMongoDBを用意

```
$ npm install -g parse-server mongodb-runner
$ mongodb-runner start
```

上記のMongoDBはテスト用途感強いので別途構築してもよい。

### parse server 設定

指定する内容が多いので、設定ファイルを書いてそれを使用。

`$parse-server config.json`


config.json

```
{
  "appId":"任意",
  "masterKey":"任意",
  "push": {
    "android": {
      "senderId": "GCMのSender-ID",
      "apiKey":"GCMのAPI KEY"
    },
    "ios": {
      "pfx": "APNS p12ファイルへのパス",
      "bundleId": "com.xxx.xx バンドルID",
      "production": true
    }
  }
}
```

p12ファイルはparse.comで設定したファイルと同様で、サーバーに置いておいてパス指定を通せばOK

appId,masterKeyは何でも構いませんが、以降で使うのでその時忘れないように。


### ポート

parse serverはデフォルトで1337を使用するので、これを外部からアクセス出来るよう設定。


### 導通テスト

ページにある通りのcurlサンプルを叩いて、MongoDBに登録され、結果が帰ってくればOK

```
curl -X POST \
-H "X-Parse-Application-Id: APPLICATION_ID" \
-H "Content-Type: application/json" \
-d '{"score":1337,"playerName":"Sean Plott","cheatMode":false}' \
http://サーバーIP:1337/parse/classes/GameScore

```

### データ確認

parse.comには素晴らしいGUIがあったのですが、この程度ならMongoDBのGUIクライアント系で確認すれば十分です。


## クライアント修正

ここまで通ればあとはページにある設定通りに事を運べはよいが、一応通知の設定・確認まで。

https://github.com/ParsePlatform/parse-server/wiki/Parse-Server-Guide

## iOS

SDK 1.12.x 以降なら問題ないかと思われます。

```
//    Parse.setApplicationId("xxx", clientKey:"xxx")

    let configuration = ParseClientConfiguration {
      $0.applicationId = "任意"
      $0.clientKey = "任意"
      $0.server = "http://サーバーIP:1337/parse"
    }
    Parse.initializeWithConfiguration(configuration)
```

初期化の際の以前使っていた Parse.setApplicationId の代わりに Parse.initializeWithConfiguration を用い、API先を指定します。


### Android

SDK 1.13.x 以降かな
こちらも Parse.initialize していた所を変更

```
Parse.initialize(new Parse.Configuration.Builder(myContext)
    .applicationId("任意")
    .clientKey(null)
    .server("http://サーバーIP/parse/") // The trailing slash is important.
```

The trailing slash is important!!



### テスト

まず上記の変更をして、実機実行。
parse serverへアクセスされtokenがMongoDBに登録されているか確認。

その後、Pushのテスト。
これで実機に通知が来ればOK

```
$ curl -X POST \
    -H "X-Parse-Application-Id: 任意" \
    -H "X-Parse-Master-Key: 任意" \
    -H "Content-Type: application/json" \
    -d '{
          "where": {
            "deviceType": {
                "$in": ["ios","android"]
             }
          },
          "data": {
            "title": "The Shining",
            "alert": "All work and no play makes Jack a dull boy.",
             "sound" : "default"

          }
        }'\   http://サーバーIP:1337/parse/push
```



## 移行スケジュール

前述のこちらのページを参照

https://github.com/ParsePlatform/parse-server/wiki/Migrating-an-Existing-Parse-App


ざくっと並べると以下の様なタスク

1. 自前のMongoDBを用意
- parse.comでのDB接続を自前MongoDBに切替
- 自前parse serverを用意
- clientを自前pase server APIを叩くようにverup
- いずれparse.comが終了

自前MongoDBへ接続切替ってあたりが結構怪しいところですが、これはまた後日報告の機会があればと。