[iOS] Parse からの乗り換えに最適!Amazon SNS に Push データを移行する方法

はじめに

すでにアナウンスがされているように、mBaaSであるParseは、そのサービスを来年2017年1月下旬に終了します。

Parseを使って動いていたアプリは、そのサービスの受け皿を別で用意する必要があります。

今回は、その一環として、Amazon SNSに、Push用の端末情報データの移行を行ってみたいと思います。

流れ

1. Parse のデータをエクスポート

2. APNs の証明書取得

3. AWS リソース作成

4. Parseデータのインポート

5. Push通知を配信してみる

parsesns

Amazon SNS から APNs を介して、Parse で配信していたのと同じ端末(今回は特定の端末)に向けて Push配信を実現するところまでやってみます。

※今回の手順は、AWS Solutions Architect ブログ: Parse PushからAmazon SNSへの移行等を参考に、最新の動向などを踏まえて、書かせていただいております。

※Parseの管理画面は、新しいUIを使用していません。環境によっては画面構成が異なる場合があるかと思います。ご了承下さい。

1. Parse のデータをエクスポート

i. Parseにログイン

スクリーンショット_2016-03-16_17_54_13

Parseのダッシュボードに入り、移行したい情報が入っているアプリケーションのCoreを開きましょう。

Push配信用の端末情報を取得したいので、Installationをクリックします。画面に端末情報一覧が表示されるのが確認できると思います。

ii. エクスポート

スクリーンショット_2016-03-16_18_04_44

画面右上に、下矢印が書かれたボックスのアイコンがあります。これをクリックします。

スクリーンショット_2016-03-16_18_06_45

すると、登録しているメールアドレスに、JSONファイル(圧縮されたもの)へのリンクが貼られたメッセージが届きます。コレをダウンロードしましょう。

※ちなみに、1-iで別項目をクリックしていた場合、その項目のデータがダウンロードされます。

iii. JSONを確認

スクリーンショット 2016-03-16 18.17.43

次に 1-ii でダウンロードしたファイルを解凍すると、_Installation.JSONなどの名前のJSONファイルが生成されます。

スクリーンショット_2016-03-16_18_17_56

中身を確認すると、Parse のダッシュボードの項目名が JSON のキーとして存在しているのが確認できます。

2. APNs の証明書をP12として取得

i. Parse から P12ファイルをダウンロード

スクリーンショット_2016-03-17_19_04_08

次に、Push配信用のP12ファイル(Production用)をゲットしましょう。通常は、既にParseで使われているものをダウンロードすればOKです。

Parseのダッシュボード内の、Settings > Pushを開くと、Push配信に関する証明書の設定画面が表示されます。

念のため、期限切れになっていないかExpiration Dateを確認しましょう。ここが過去の日付の場合、すでに証明書は期限切れで無効です。2-iii の方法を使い、新規に作成し、改めてP12ファイルを書き出しましょう。

Apple Push Certificates の中に現在使用している証明書から生成されたP12ファイルがあるかと思います。その右下にある、Download をクリックすると、P12ファイルをゲットできます。

ii. P12ファイル・証明書を探す

もし、P12ファイルが表示されていない場合、皆さんの Mac のローカルディスクなどの中に、該当のP12ファイルがないか探してみてください。

もしくは、キーチェーンアプリ内にP12ファイルの元となった、期限の切れていない証明書があれば、そこから 2-iv の方法で、P12ファイルを書き出すことが出来ます。

iii. 証明書ファイルを生成

スクリーンショット_2016-03-16_18_30_25

証明書やP12ファイルがないか、期限切れになっている場合、新規に作成する必要があります。 以下リンクを参考に、Apple Member Center の Certificates, Identifiers & Profiles(要ログイン)で、Apple Push Notification service SSL (Sandbox & Production)証明書ファイルを生成しましょう。

よく分かる!iOS アプリ開発に必要な証明書ファイルの作成方法 2015年版 | Developers.IO

iv. 証明書をP12として書き出し

ここまでの工程を経て、証明書はあるけどP12ファイルはない、という方は以下を実施しましょう。

スクリーンショット_2016-03-17_11_42_16

まず、Mac の標準アプリキーチェーンアクセスを起動し、左ペインのキーチェーンからログインを、分類から証明書を選択します。

スクリーンショット_2016-03-16_18_34_58

続いて、証明書一覧の中から、必要なものを探します。アプリのBundle Identifier名や、Apple Push Servicesと書かれた項目を探すと、すぐ見つかるでしょう。

貼り付けた画像_2016_03_17_23_19

証明書が見つかったら、選択し、右クリックします。該当項目を書き出すメニュー項目が表示されますので、クリックします。

貼り付けた画像_2016_03_17_23_21

続いて表示されるウインドウにおいて、名前でP12ファイルとして書き出したい名前を指定します。場所で書き出し先フォルダを選択します。また、 個人情報交換 (.p12) が選択されていることを確認し、保存をクリックします。

スクリーンショット 2016-03-16 18.27.39

続いて、P12ファイルに設定するパスワードを聞かれます。今回、パスワードを指定せずにそのままOKをクリックしています。

スクリーンショット_2016-03-16_18_27_55

パスワードを入力し、許可を選択し、書き出しを行います。

3. AWS リソース作成

ここでは、すでにAWSアカウントをお持ちの前提で進めていきます。

なお、ここから先は、Amazon SNS (Amazon Simple Notification Service) の機能を使っていきますが、mBaaSとしての機能を補完してくれるMobile Hubを介してAmazon SNSを使っていきます。
若干分かりくいですが、Mobile Hub の Push Notifications は Amazon SNS を利用して実現している、とイメージ頂ければ良いと思います。ちなみに、Mobile Hub は他にもいろんなサービスを提供していますが、その実態は、AWSの別のサービスが担っていたりします。
以下の手順をこなしていけば、データ移行できますので、ご安心ください!

i. Mobile Hub プロジェクトの作成

スクリーンショット_2016-03-16_18_45_10

AWSのマネジメントコンソールトップ画面等から Mobile Hub に入ります。

初めて Mobile Hub のプロジェクトを立ち上げる場合、以下リンク先記事の 3.2.1 ~ 3.2.5 を参考に、進めてください。

AWS Solutions Architect ブログ: Parse PushからAmazon SNSへの移行

スクリーンショット_2016-03-17_19_35_25

すでに、1つ以上 Mobile Hub プロジェクトをお持ちの方は、プロジェクト一覧画面が表示されます。

Create new mobile projectをクリックましょう。

スクリーンショット_2016-03-16_18_46_08

続いて、任意の名前でプロジェクト作成を開始します。

スクリーンショット_2016-03-17_19_39_36

すると、プロジェクトで使える様々なサービスを管理する画面が表示されます。

User Data StorageUser Sign-in、そしてCloud Logicなど、Parseを連想させる機能が揃っていますね。

ii. Push Notifications の設定

スクリーンショット 2016-03-16 18.47.54

ここで、Push Notificationsをクリックします。

スクリーンショット_2016-03-16_18_48_38

続く画面で、Enable Pushをクリックし、iOSをクリックします。

貼り付けた画像_2016_03_17_23_32

P12 Certificateの下にあるファイルを選択をクリックし、用意したP12ファイルを選択し、Upload certificateをクリックします。

スクリーンショット_2016-03-16_18_51_55

What topics would you like to send push notifications to from your app? が表示されたら、内容を確認し、必要に応じてチェックマークを入れます。どのトピックに向けてプッシュを配信するかを決定します。

トピックは、ここでは、Push送信先のデバイストークン情報などを一括して持つもの、といった感じで捉えて頂ければOKだと思います。

Save changesをクリックします。

iii. Resources

画面左のメニューの Resources をクリックします。

貼り付けた画像_2016_03_18_11_36

スクリーンショット_2016-03-17_20_25_01

  • トピック名: Amazon SNS Topics に書かれた、リンク文字列をメモアプリなどにコピーしておきます。

  • APNs名: Amazon SNS Platform Applications に書かれた、APNS/を除くリンク文字列をコピーしておきます。

これらの情報は後で使うので、コピーしておきましょう。

iv. AWS クレデンシャルの取得

貼り付けた画像_2016_03_18_11_32

AWSマネジメントコンソールの右上に書かれている、ユーザアカウント名(xxx@xxx-xxx...などと書かれている部分)をクリックし、プルダウンメニューから認証情報をクリックします。

貼り付けた画像_2016_03_18_11_46

続いて左ペインからユーザーをクリックします。該当するユーザー名をクリックすると、IAMの情報が表示されます。さらに、認証情報タブをクリックし、アクセスキーの追加をクリックします。

Cannot exceed quota for AccessKeysPerUser: x などと表示された場合は、アクセスキーの数がMAXになっていますので、必要ないものがあれば消す、など行ってください。

スクリーンショット_2016-03-16_19_00_26

アクセスキーの作成ウインドウが表示されます。このウインドウに書かれている通り、今回作成したアクセスキーに関して、認証情報をダウンロードできる最後の機会です。

貼り付けた画像_2016_03_18_11_30

ユーザーのセキュリティ認証情報を表示をクリックすれば、アクセスキーIDシークレットアクセスキーを直接画面上に表示できます。これを適切な方法・場所において、コピー・保存しておいてもOKです。

認証情報は、後ほど使います。

4. Parseデータのインポート

ココでは、Parseでゲットした JSON データを Mobile Hub 側にコピーします。移行には専用のコマンドラインツール(Java)を使います。

i. Parse Push移行ツールのダウンロード

以下からダウンロードします。

Parse Push移行ツール

また、このjarファイルを実行するため、Java実行環境がインストールされていなければ、以下からインストールしましょう。

Java SE Runtime Environment 8 - Downloads

こちらから、Mac OS X x64 用の、Java SE Runtime Environment をダウンロードし、インストールします。dmg形式を選択するのが簡単で良いでしょう。

ii. 実行コマンド作成

Parse Push 移行ツールを実行するためのコマンドを書きます。

少々長いので、シェルスクリプトとして保存しておくと、使い回しができて便利でしょう。

内容は以下の通りです。今回は、import.shの名前で、JSONファイルと同じフォルダに保存します。

java -jar SNSImportTool.jar -v -s -f ./xxx.JSON
--apnsName <3.iiiのAPNs名>
--topicName <3.iiiのトピック名>
--awsaccess <3.ivのアクセスキーID>
--awssecret <3.ivのシークレットアクセスキー>

※上記で、xxxで表記されている部分は、実際とは異なる(これ以降のログも同様)

※三角カッコ < > は実際には入力しない

iii. JSONファイルの加工

インポートするために、以下コマンドを、ターミナルから実行してみます。

sh import.sh

すると、コマンドが実行されます。しかし、Parse の JSON そのままでは、インポート実行時に以下の様なエラーが出ます。

$ sh importParsePushData2.sh
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "afternoon" (class SNSImportTool$ParseResults$Entry), not marked as ignorable (9 known properties: "badge", "deviceToken", "endpointArn", "updatedAt", "channels", "deviceType", "subscriptionArns", "objectId", "createdAt"])
 at [Source: ./parsetosnsall.json; line: 3, column: 25] (through reference chain: ParseResults["results"]->Object[][0]->Entry["afternoon"])
    at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:51)

(以下略)

移行ツールが対応していない、キーの名前とその値を削除する必要があります。また、元の JSON にない項目を追加する必要があります。

上記エラーを見ると、以下のキーに対応していることが分かります。

  • "badge"
  • "deviceToken"
  • "endpointArn"
  • "updatedAt"
  • "channels"
  • "deviceType"
  • "subscriptionArns"
  • "objectId"
  • "createdAt"

コレ以外のキーが入っているとエラーになるようです。 また、Parseから出力された JSON には、上記の内 "channels" キーがありませんでした。このキーと対応する値がないとエラーが出ます。データの全項目にこのキーと適当な値を追加しましょう。

"channels": ["",""],

JSONから一部抜粋するとこのような形になります。

最終的には、以下のようなJSONファイルを作成しました。

{ "results": [
        {
        "badge": 0,
        "channels": ["",""],
        "createdAt": "2016-03-14T03:27:13.688Z",
        "deviceToken": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "deviceType": "ios",
        "objectId": "3mfxxxxxxx",
        "updatedAt": "2016-03-14T03:27:13.688Z"
    },
    {
        "badge": 0,

        (以下略)

iv. インポート実行

再度コマンドを実行します。

sh import.sh

すると、ログ出力をしながらデータ移行が実施されます。データ件数に応じて、ログの長さは異なります。

$ sh importParsePushData.sh
===========================================
Import from Parse to Amazon SNS
===========================================

Verify platform application: app/APNS/parsetoawstest_MOBILEHUB_000000000
{Attributes: {Enabled=true, AppleCertificateExpirationDate=2017-04-13T05:57:25Z}}

Created 0 channel topics:

Entry(badge=0, channels=[, ], createdAt=2016-03-14T03:27:13.688Z, deviceToken=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, deviceType=ios, objectId=3mfxxxxxxx, updatedAt=2016-03-14T03:27:13.688Z)
now registered as arn:aws:sns:us-east-1:000000000000:endpoint/APNS/parsetoawstest_MOBILEHUB_000000000/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
and subscribed to globalTopic arn:aws:sns:us-east-1:000000000000:parse_parsetoawstest_alldevices_MOBILEHUB_000000000:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Entry(badge=0, channels=[, ], createdAt=2016-03-14T09:47:26.781Z, deviceToken=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, deviceType=ios, objectId=neSxxxxxxx, updatedAt=2016-03-14T10:10:42.061Z)
now registered as arn:aws:sns:us-east-1:000000000000:endpoint/APNS/parsetoawstest_MOBILEHUB_000000000/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
and subscribed to globalTopic arn:aws:sns:us-east-1:404956753679:parse_parsetoawstest_alldevices_MOBILEHUB_000000000/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx


Mapping of new endpoints to topics


Subscriptions in topic parsetoawstest_alldevices_MOBILEHUB_000000000
TopicArn: arn:aws:sns:us-east-1:000000000000:parse_parsetoawstest_alldevices_MOBILEHUB_000000000
arn:aws:sns:us-east-1:000000000000:endpoint/APNS/parsetoawstest_MOBILEHUB_000000000/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
arn:aws:sns:us-east-1:000000000000:endpoint/APNS/parsetoawstest_MOBILEHUB_000000000/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Program has ended, please type 'exit' to close console

正しくデータが移行できたか確認しましょう。

スクリーンショット_2016-03-17_20_36_06

Mobile Hub > 対象アプリケーション > Resources と進み、Amazon SNS Platform Applicationsの中にあるリンク文字列(APNS/から始まるもの)をクリックします。

スクリーンショット_2016-03-17_20_41_04

デバイストークンを含む、端末情報が移行できていることが確認できると思います。

5. Push通知を配信してみる

Amazon SNS から Push を配信してみましょう。

ここでは、特定の端末に向けて、送ってみます。

スクリーンショット_2016-03-17_20_44_25

Tokenの値は、Parseの DeviceToken と同じです。ご自分の特定端末などに向けて Push を送ることが出来ます。

スクリーンショット_2016-03-17_20_45_28

メッセージの内容などを決め、送信します。

貼り付けた画像_2016_03_18_11_54

iPhoneにPush通知が送られてきました!成功です!

スクリーンショット_2016-03-17_20_41_04

送ったあと、Endpoints 欄の Enabledtrue の場合、正常に送られたことがわかります。

逆に、falseの場合、うまく送れなかったということになります。原因はいろいろ考えられますが、例えば、P12ファイルや、その元になった証明書ファイルが正しくない、開発用の物を使っている、期限が切れている、Parseで使っているものとは異なる、などが考えられます。

まとめ

Parse の データを Amazon SNS (Mobile Hub)  に移行するのは、一定の手間がかかりますが、順を追っていけば、難しい作業ではない事が分かりました。

ぜひ試してみてください!