Intelligent Technology's Technical Blog

株式会社インテリジェントテクノロジーの技術情報ブログです。

iOS で GCM(Google Cloud Messaging)のプッシュ通知を試す(後編)

こんにちは。中山です。

前編に引き続き、iOS + GCM(Google Cloud Messaging)で、プッシュ通知を試すための手順をご紹介していきます。


iOS + GCM でプッシュ通知を試してみるための手順は、おおまかには以下のようになっています。

  1. APNs の設定を行って、
  2. GCM の設定を行って、
  3. サンプルアプリのプロジェクトを取得して、
  4. GCM の設定をサンプルアプリのプロジェクトに適用して、
  5. サンプルアプリを実行する。

前編では、このうちの「1」まで実践できました。この後編では、その続きからさっそく見ていくことにします。

GCM の設定

Add Google Services のページに遷移して、Google アカウントでサインインします。(Google アカウントはあらかじめ取得しておきます。)

表示された画面で、

  • App Name: アプリを識別する名前(今回は「GCM Example」としました)。
  • iOS Bundle ID: 前編の手順の中で、App ID の新規登録時に指定した Bundle ID(今回の場合は「jp.co.iti.samples.gcmexample」)。
  • Your country / region: 日本

と入力します。入力完了後、「Choose and configure services」をクリックします。

f:id:IntelligentTechnology:20151007140902p:plain

次に表示される画面で、「Cloud Messaging」が選択されていることを確認して、下側の「Development APNS Certificate」の「UPLOAD」ボタンをクリックします。
ファイル選択のダイアログが表示されますので、前編での App ID の設定更新の手順の中で作成していた、拡張子が「.p12」のファイル(今回の場合は「gcmexample.p12」です)を指定します。(以下の画面イメージでは、ボタン名が「UPDATE」となっていますが、ファイルをまだ一度もアップロードしていない場合は「UPLOAD」と表示されます。)

f:id:IntelligentTechnology:20151007143212p:plain

そのあと、「ENABLE GOOGLE CLOUD MESSAGING」をクリックします。

f:id:IntelligentTechnology:20151007144040p:plain

GCM が有効になり、「Server API Key」と「Sender ID」が画面上に表示されます。(この値は、後ほどの手順で再度利用します。)

f:id:IntelligentTechnology:20151007145023p:plain

続いて「Generate configulation files」をクリックします。

f:id:IntelligentTechnology:20151007145218p:plain

ボタンをクリックして、「GoogleService-Info.plist」ファイルをローカルにダウンロードします。

f:id:IntelligentTechnology:20151007145852p:plain

サンプルアプリのプロジェクトの取得

CocoaPods を用いて、サンプルアプリのプロジェクトを取得します。
ターミナルを開いて、任意のフォルダで、以下コマンドを実行します。*1

pod try Google

コマンドを実行すると、以下のように取得するプロジェクトの選択オプションが表示されます。

f:id:IntelligentTechnology:20151006161541p:plain

ここでは、「4:GcmExample.xcodeproj」を選択します。
サンプルプロジェクトの取得が完了すると、自動的に Xcode が起動します。(GcmExample プロジェクトが開かれた状態となります。)

サンプルアプリプロジェクトへの、設定の適用

「GoogleService-Info.plist」ファイルの導入

先ほどダウンロードした「GoogleService-Info.plist」ファイルを、Xcode 上の GcmExample プロジェクトのルートフォルダまでドラッグします。

以下のように、「Add to targets」をすべてチェックして、「Finish」をクリックします。

f:id:IntelligentTechnology:20151007151934p:plain

追加されたファイルは以下のように表示されます。

f:id:IntelligentTechnology:20151007152112p:plain

Bundle Identifier の変更

サンプルプロジェクト内の「GcmExample」「GcmExampleSwift」の「Bundle Identifier」に、前編での App ID 登録の手順で指定した Bundle ID(今回の場合は「jp.co.iti.samples.gcmexample」)の値を指定します。

f:id:IntelligentTechnology:20151007160146p:plain

f:id:IntelligentTechnology:20151007160156p:plain

サンプルアプリの実行

Provisioning Profile 登録(前編で実施した手順です)時に動作検証対象とした iOS 端末(iPad、iPhone など)を Mac に接続して、サンプルプロジェクト内の「GcmExample」アプリを実行します。
アプリが起動されると、自動的に GCM への登録が行われます。登録が成功すると、以下のようなメッセージが表示されます。

f:id:IntelligentTechnology:20151007160834j:plain:w240

また、Xcode のコンソールに、以下のように「Registration Token」の値が出力されます。

f:id:IntelligentTechnology:20151007162209p:plain

次に、サンプルプロジェクト内の「GcmServerDemo」アプリを、Mac 上で実行します。

f:id:IntelligentTechnology:20151007162621p:plain

「apiKey」には、先ほど GCM の設定の手順で取得した「Server API Key」の値を指定します。
また「RegistrationToken」には、Xcode のコンソールに出力されていた「Registration Token」の値を指定します。
なお、「Display cURL command」ボタンをクリックすると、GCM サーバに送信される、cURL のコマンド文字列が表示されます。

f:id:IntelligentTechnology:20151009091343p:plain

この状態で「Send notification」ボタンをクリックすると、

f:id:IntelligentTechnology:20151006132034j:plain:w240

このように iOS 端末側に、通知が表示されます。

もうひとつの「Send to topic」ボタンは、複数の端末を対象とした、トピックメッセージを送信します。
トピックメッセージの場合は、ここでの「RegistrationToken」の指定は不要です。

どんな仕組み?

iOS + GCM でのプッシュ通知は、実際どのような仕組みで動作しているのでしょうか。
これについては、Google I/O 2015 の以下のビデオが、いちばんわかりやすい解説になっているようです。(8分39秒あたりから。)

youtu.be

まず APNs サーバに接続して APNs Token を取得して、

f:id:IntelligentTechnology:20151008153431p:plain

GCM サーバから Registration Token を取得して、

f:id:IntelligentTechnology:20151008153530p:plain

アプリケションサーバに Registration Token の情報を渡して、

f:id:IntelligentTechnology:20151008153643p:plain

アプリケーションサーバ側では、受け取った情報をもとに、GCM 経由で、メッセージを対象の端末に通知します。

f:id:IntelligentTechnology:20151008153749p:plain

アプリがバックグラウンド状態の場合は、GCM は、APNs に通知処理をお願いする形になります。

f:id:IntelligentTechnology:20151008154101p:plain

再度アプリがアクティブになると、GCM から直接通知が届くようになります。

f:id:IntelligentTechnology:20151008154259p:plain

まとめ

以上、前編・後編にわたって、iOS + GCM のプッシュ通知機能を試す手順をご紹介しました。
いろいろ手順が必要なのは、ほとんど APNs の設定のほうで、それが完了すると、あとは比較的シンプルな手順で実現できるのではないかと思います。
また今回は、用意されてあるサンプルプログラムを実行しただけなので、実装の詳しいところまでは確認できていません。
これらについては、また別の機会に試せるとよいなぁ、と思っています。

*1:OS X 10.10 の環境下で CocoaPods がうまく動作しないという現象がありました。これについては、こちらの記事を参考にして解決しました。