2015.12.18

プッシュ通知サービスによるネイティブアプリ間の連携について

始めに

こんにちは。次世代システム研究室のT.D.Qです。
スマホアプリの機能の中でも、注目を浴びているプッシュ通知です。LINE、Facebookメッセンジャーなどで友達とメッセージ交換(チャット)するとき、スマホにプッシュ通知が来ることがよくあるでしょう。単一ウェブサービスとアプリ間で配信するのが一般的な使い方ですが、最近、このプッシュ通知メカニズムを利用して、異なるウェブサービスのネイティブアプリ間の連携を試しましたので、今回、この連携方法についてご紹介したいと思います。

実現したいこと

以下の画像のように、ウェブサービスAとウェブサービスBは業務連携APIによって連携してあります。また、両ウェブサービスそれぞれに専用ネイティブアプリ(AndroidとiOS両方)が開発されています。
pn_client_server_apps
サービスAの専用アプリの特定なAPIを使うと、リアルタイムにサービスB用のアプリにAPIの処理の結果を通知することは、今回実現したいことです。
この仕様において、プッシュ通知を利用することで、以下のメリットが挙げられます。
・リアルタイムな情報配信
・JSON形式で送信し、両OSそれぞれに適切な通知が受信できる
・ユーザーが操作しなくても端末が休眠な状態でも、通知が受け取れる
・アプリの常駐が不要なので、通信量やバッテリ消費が抑えられる
・開発コストが比較的に少ない
プッシュ通知はiOSデバイスに対してはアップルの「APNs(Apple Push Notification service)」、Androidデバイスに対してはグーグルの「GCM(Google Cloud Messaging)」を利用して実現します。

プッシュ通知サービス

プッシュ通知は、ユーザーがスマートフォンアプリを起動していなくとも、iOS、Androidなどの端末へ通知を送る仕組みのことです。細かな違いはありますが、APNs・GCM共に基本的な考え方は同じで、プッシュ通知を実現するためには「デバイス情報の登録機能」と「プッシュ通知の配信機能」を実装する必要があります。

GCMでのプッシュ通知の利用仕組み

GCM(Google Cloud Messaging)とは、アプリケーションサーバーから Android デバイス上の Android アプリにデータを送信できるようにするサービスです。配信仕組みは以下の図ではその仕組みを示しています。詳細はGoogle公式ドキュメントの参照ください

GCMの処理の流れ-http://www.atmarkit.co.jp

引用:http://www.atmarkit.co.jp/ait/articles/1302/12/news029.html

APNSでのプッシュ通知の利用仕組み

iOS端末へのプッシュ通知サービスは、APNs(Apple Push Notification service)です。ウェブサービス側に登録されたプッシュ通知を、APNsに送信することで、各端末にプッシュ通知が受信される仕組みです。以下の図ではAPNsの配信仕組みを示しています。APNsの詳細情報はこちら

ios-push-notification
引用:http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios-6-tutorial-part-1

Push通知サービスによるネイティブアプリ間の連携

プッシュ通知サービスによるネイティブアプリ間の連携を実現するために、以下の図のように、「デバイス情報の登録機能」と「プッシュ通知の配信機能」を実装します。

pn_client_all_pattern_1

つまり、今回実現したいアプリ間の業務連携は下記の流れとなります。
① サービスA用のアプリ上でウェブサービスAの業務APIを実行する
② ウェブサービスAの処理が完了したら、業務連携APIによって、処理結果をウェブサービスBへ渡す
③ウェブサービスBが、ウェブサービスAからの情報を処理し、プッシュ通知サービスを経由して処理結果をサービスB用のアプリへ渡す
④アプリB側が、通知した内容からJSONデータを分析し、アプリAで実行した結果を表示する

デバイス情報の登録

GCM・APNsを使用するため、まずはサービスの設定が必要です。サービス設定はGoogleApple公式ドキュメントでも詳しく紹介されているので、ご参照ください。
iOSのほうが、プロバイダ証明書、プロビジョニングプロファイルを作成する必要があり、手順がやや複雑ですが、ネットで実装する方法の詳細まとめを参考し、解決しました。

ウェブサービス側にデバイストークンを保存

サービスB用のアプリへプッシュ通知を行うためにはデバイス情報をウェブサービス側で管理する必要があるため、アプリB内でデバイストークンを取得した後にウェブサービスBのサーバに送信して格納しておきます。また、デバイストークンはAPNs・GCM側で定期的にリフレッシュされているので、確実にプッシュ通知を行うためにはアプリ起動時に毎回デバイストークンをサーバに送信し、最新化を行っていく必要があります。

pn_device_id_registration_b

プッシュ通知の配信

プッシュ通知サービスによるサービスB用のアプリに処理結果を渡すため、この処理が、サービスBで実装します。
プッシュ通知を配信するには、APNs・GCMに対して基本的には「認証キー」「デバイストークン」「メッセージ」を送る必要があります。これによりデバイストークンとひも付いた実端末に配信が行われます。

pn_push_from_server

すべてのメッセージが異なるコンテンツを持っていることとアプリB側にJSONデータを処理する必要なので、ペイロード付きメッセージを使います。ペイロードメッセージには 4 KB までを含めることができます。次のようにサービスBからアプリへデータを渡します。
{
    "registration_id" : "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...",
    "data" : {
        "member_id" : "123456",
        "message" : "処理が成功しました"
    },
}

最後に

ここまで、AndroidとiOSにプッシュ通知サービスを利用して異なるウェブサービスのネイティブアプリの連携をご紹介しました。ウェブサービス側にAndroid・iOSでサーバーサイドのコード書き分けすることもあると思いますが、最近、新しいGCMでAndroid・iOSの両方にプッシュ通知を送信できるようになったので、さらに便利になっています。プッシュ通知サービスを利用したい方々、ぜひ検討してください。

次世代システム研究室では、アプリケーション開発や設計を行うアーキテクトを募集しています。アプリケーション開発者の方、次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ 募集職種一覧からご応募をお願いします。

参考リンク

Apple Push Notification Service
Google Cloud Messaging
iOSでプッシュ通知を実装する方法の超詳細まとめ
iOSとAndroidのプッシュ通知の違い
GCMを使用してANDROID-PHPでPUSH通知を実装する

Pocket