KiiCloud

ひとりKii Cloud Advent Calendar 2014-12-21

More than 3 years have passed since last update.

この記事は、ひとりKii Cloud Advent Calendarの21日目の記事です。


21日目「GCM(Push)を使いたい」

今日はABC 2014 winterでバザール出店してました。参加された皆様おつかれさまでした。

そこで「はよ非公式ライブラリのPushの使い方を説明せい」とツッコミを頂いたので急いで説明。


GCMの準備をする

はてなダイアリーで昔書いたエントリーのダイジェストで準備する。


Google Developer Consoleでプロジェクトを作る

ここでプロジェクトを作る


Google Cloud Messaging for Androidを有効にする

APIと認証 -> API


サーバー用のキーを作る

APIと認証 -> 認証情報 で、新しい「サーバーキー」を作成。IPアドレスの欄は空白にしておく(ここ重要) Kii Cloudはクラウドなので、投げもとのIPアドレスが固定にならないため。


プロジェクト番号をメモする

概要 で表示される「プロジェクト番号」をメモしておく。後でアプリ側にこの番号を埋め込む。


アプリ側でトークンを取得する

ここからはアプリ側の準備。


AndroidManifest.xmlを編集する

重要なのはpermissionと、{package}の部分の置換。この{package}の部分を適当に書いてしまって動きません>< は誰もが通る道(なのか?

<manifest package="{package}" ...>

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

<permission android:name="{package}.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="{package}.permission.C2D_MESSAGE" />

<application ...>
<receiver
android:name="{package}.MyBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="{package}" />
</intent-filter>
</receiver>
<!-- <service android:name=".MyIntentService" /> -->
</application>

</manifest>

IntentServiceを使う方法は、次回のPushを受信する回でやる予定。というか製品ではそっち使わないと非常にまずい


トークンを取得する

アプリ起動直後や、Kii Cloudへのログイン処理後にトークンを取得する。例はActivityに処理を書いてるが、Fragmentでも全く問題ない(getActivity().getApplicationContext()とする点だけ注意)

public class MainActivity extends Activity {

protected static final String SENDER_ID = "<API consoleで取得したSENDER ID>";
private GoogleCloudMessaging gcm;
private String regId;

private void getRegistrationId() {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
if (gcm == null) {
gcm = GoogleCloudMessaging.getInstance(getApplicationContext());
}
try {
regId = gcm.register(SENDER_ID);
Log.v("GCM", "regId is " + regId);
} catch (IOException e) {
Log.e("GCM", "error " + e.getMessage());
}
return null;
}
}.execute();
}
}


取得したトークンをKii Cloudに登録する(インストール)

ここでようやく非公式ライブラリの出番。といってもinstallDevice()を呼ぶだけ。

// tokenは先ほど取得したregIdのこと。デバイストークン

// mAPIはログイン済み(=アクセストークンセット済み)であること!
mAPI.userAPI().installDevice(token, new UserAPI.UserCallback<KiiUser>() {
@Override
public void onSuccess(KiiUser kiiUser) {
callback.onSuccess();
}

@Override
public void onError(Exception e) {
callback.onError(e);
}
});


Pushを受信する側を作る

先ほどAndroidManifest.xmlに追加したReceiverを追加する。ホントはWakefulBroadcastReceiverを使うべきだが、今回は単なる受信チェックのみなので直で書いちゃう。

public class MyBroadcastReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
// ログに出してみよう
Log.v("Push", "Received " + intent);
}
}


試しに送ってみる

Developer Consoleでユーザー指定で何か送れるので、送ってみる(スクリーンショット省略)