いまから30分以内にAndroidアプリでPUSH通知を実装しろと言われた時に読む記事

  • 68
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

parse.comは2017年1月28日にサービス終了するので、この記事はそろそろ参考にしないでください

mixiグループアドベントカレンダー16日目です。

9月くらいから今月の3日まで、無料動画のオンライン学習サイト - schoo WEB-campusで初心者向けにAndroidアプリの開発講座を担当していました。

テーマは色々あったのですが、その中でもParse.comを用いたPUSH通知についてかいつまんで紹介できたらと思います。

概要

自前でバックエンド用意するのダルいし、とりあえずparse.comでちょこっと設定だけしてPUSH通知実装したい、という時にどうすれば実現できるかをまとめます。

すでに既存のアカウント体系やバックエンドを利用している場合でも、push通知のためだけにparseをちょっとだけ使って実現することが可能です。

また、ここで言うPUSH通知は以下のようなものを取り上げます。

  • インストール済みの全デバイスに一括PUSH通知
  • 任意の条件のユーザーに一括PUSH通知
  • 任意のユーザー間でのPUSH通知(例:LikeしたらPUSH通知が飛ぶ)

一応お金の話をしておくと、月に100万UU以上にPUSH通知を送信すると課金されます。(料金表)

話さないこと

iOSでの実装/設定方法については話しません。プロビジョニングの設定のところだけ除けば、そんなに変わらないと思います。(想像)

また、Notificationのカスタマイズ(画像を表示したり、通知開いたら、どのActivity開くとか)についても触れません。いちおう紹介だけすると、ParsePushBroadcastReceiverを継承したレシーバを作って、AndroidManifest.xmlの設定をParsePushBroadcastReceiverと置き換えれば良いです。(実装例)

準備

Google Developer Console(2分)

Google Developer ConsoleでAPIキーを取得しておきます。

プロジェクトを適当に作って、ダッシュボードの「Google API を利用する」からCloud Messaging for Androidを有効にします。ちなみにこの時ダッシュボードにあるプロジェクト名の下にあるID: projectname-xxxx (#xxxxxxxxx)というところですが、括弧で囲まれた数字の方が後にParseの管理画面で入れるSenderIDになります。

Screen Shot 2015-12-08 at 12.26.58.png

その後認証情報で「APIキー」 > 「サーバーキー」としてキーを追加します。

Parseでの各種設定(4分)

以下3つの手順が必要です。最初の2つはボタンクリックと名前入力するだけなので説明省きます。

  • アカウント登録
  • プロジェクト作成
  • APIキーの登録
  • Client pushの有効化(アプリ側の実装でPUSH通知するようParseをキックするのに必要)

APIキー登録

Google Developer Consoleで取得した、APIキーとSender ID(数字)を入力します

Screen Shot 2015-12-08 at 12.28.23.png

Client pushの有効化

チェックボックスを有効にするだけです。

Screen Shot 2015-12-08 at 12.28.51.png

アプリの実装(5分〜20分)

アプリが実装しなければいけないものは基本的には以下3つです。全ユーザーに送信したいだけなら、最初の2つだけで十分です。

  • build.gradle, AndroidManifest.xmlにおまじない
  • device token(registration ID)の登録
  • (optional) 任意のUserに通知を送信

実際の実装例はこちらをご覧ください。

https://github.com/KeithYokoma/PhotoUploader

って、@KeithYokoma のかよ、ってツッコミが聞こえますが、スクー講師4名(@hidey , @akkuma , @KeithYokoma, @punchdrunker )で作った教材アプリなので、ご勘弁を。

おまじない

こちらのdocumentのとおりです。英語ちゃんと読めば問題ないはず。
https://www.parse.com/apps/quickstart#parse_push/android/native/existing

もしSDKのDLが面倒であれば、build.gradleの冒頭に以下のような記述をしておけば、SDKを手で入れなくても大丈夫です。

# 実装例はこちらを参照してください→ https://github.com/KeithYokoma/PhotoUploader/blob/master/app/build.gradle
apply plugin: 'com.android.application'
apply plugin: 'com.parse'

buildscript {
    repositories {
        mavenCentral()
        maven { url 'https://maven.parse.com/repo' }
    }
    dependencies {
        classpath 'com.parse.tools:gradle:1.+'
    }
}

一応ですが、注意が必要なのは、initializeはApplicationクラスのonCreate内に書いてください。まだなければApplicationを継承したクラスを作って、AndroidManifestで追記してください

public class UploadApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        // initializeは1回だけ実行されることを期待しています。
        Parse.initialize(this, getString(R.string.parse_application_id), getString(R.string.parse_client_key));
    }
}

AndroidManifest.xmlでも変更。(android:nameのとこ)

    <application
        android:name=".UploadApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >

あとは、com.parse.starterとなっているところは自分のアプリのパッケージ名に置き換えること。(ドキュメントのコメントの通りです)

device token(registration ID)の登録

さきほどのinitializeの直後に以下の行を入れれば、匿名のデバイストークンとして登録できます。
インストールした人全員に送れればokという場合は以上で準備完了です。

# 匿名のデバイストークンで良い場合
ParseInstallation.getCurrentInstallation().saveInBackground();

そうではなく、特定の属性などを付けたい場合、ParseInstallationはParseObjectを継承しているので、柔軟にデータを付与することができます。

ParseInstallation installation = ParseInstallation.getCurrentInstallation();
# 既存のアカウント体系のIDを振る
installation.put("member_id", member_id);
# ただの属性でも良い
installation.put("gender", "male");
installation.saveInBackground();

Parseで認証までやりたい場合はParseUserオブジェクトの参照をそのまま渡すことが可能です。

ParseInstallation installation = ParseInstallation.getCurrentInstallation();
// ログイン中のユーザ(自分)への参照を紐付ける
installation.put("user",ParseUser.getCurrentUser());
installation.saveInBackground();

ちなみに、parseではアカウント作成/認証もさほど時間掛けずに実現できますが今回はPUSH通知が本題なので、説明しません。
リファレンス: https://www.parse.com/apps/quickstart#social/mobile/android/native/existing
実装例: https://github.com/KeithYokoma/PhotoUploader/blob/master/app/src/main/java/com/example/uploader/LoginActivity.java

PUSH通知を実際に飛ばす

準備が出来たので、実際に通知を飛ばしてみましょう。

管理画面から一括送信

Parseの管理画面からPushタブを選択して、「Send a push」ボタンを押せば一括送信できます。条件指定もできます。解説不要な簡単UI。

アプリの実装からPUSH通知送信

ユーザーが他ユーザーの写真にLikeしたら投稿主にPUSH通知を飛ばしたい、という場合は管理画面の機能だけでは難しいと思います(たぶん)。冒頭に設定したClient pushを利用します。

前段の例で説明すると、

// Likeに成功した直後に...
// インストールデータを特定するクエリ
ParseQuery<ParseInstallation> installationQuery = ParseInstallation.getQuery();

// 条件を付ける
installationQuery.whereMatches("member_id", memberId);

ParsePush push = new ParsePush();
// 上記の条件を指定する
push.setQuery(installationQuery);
push.setMessage(ParseUser.getCurrentUser().getUsername() + " liked your photo!");
push.sendInBackground();

ParseUserを条件に利用する場合は

// Likeに成功した直後に....
// ユーザーを特定するクエリ
ParseQuery userQuery = ParseUser.getQuery();
userQuery.whereEqualTo("objectId", mTargetUserId);

// インストールデータを特定するクエリ
ParseQuery<ParseInstallation> installationQuery = ParseInstallation.getQuery();

// 指定ユーザーのインストールデータという条件を付ける
installationQuery.whereMatchesQuery("user", userQuery);

ParsePush push = new ParsePush();
// 上記の条件を指定する
push.setQuery(installationQuery);
push.setMessage(ParseUser.getCurrentUser().getUsername() + " liked your photo!");
push.sendInBackground();

まとめ

ParseInstallationデータを活用することで、柔軟なPUSH通知が簡単に実現できました。

一括送信までだったら、ものの10分で準備ができます。
(個人の感想であり効果・効能を示すものではありません。)

次のエントリ

明日は @kikuchy さんです。よろしくお願いします。