はじめに
免責
本記事は中国語サイトを自動翻訳しながら記述したものであり、内容が不正確であることをあらかじめご了承ください。本記事で記述されている、ネットワークサービスやライブラリの信頼性、セキュリティに関しても自己責任でご利用をお願いします。「斜め」の文字は、Googleで機械的に翻訳した日本語訳です。
JPushについて
通常日本でAndroidにプッシュ通知するにはGoogleのFCMを使用するかと思いますが、中国のインターネットはグレートファイアウォールで囲まれており、FCMからはネットワークアクセスできません。代わりに、JIGUANG(极光)のJPushが使えるということなので、このサービスでテスト端末にPush送信してみました。テストは日本国内で行なっていますが、普通のドコモのAndorid端末でpushを受け取れました。
アカウント作成
QQアカウントの作成
事前の準備としてJIGUANGのアカウント作成しますが、その際にQQの番号が必要となります。そのため先にQQアカウントを作成します。QQは、中国のメッセンジャーアプリです。
登録方法はいろいろありますが、英語のサイトがあったので今回はここからやります。
https://ssl.zc.qq.com/v3/index-en.html?from=pt
NicknameとPasswordは、任意の値を入れてください。Telには、日本の国際番号81と携帯番号を入れます。携帯番号を1つしか持っていないので再確認できないのですが、上の3項目だけ入れれば、10桁くらいの数値のQQの番号がもらえたと思います。
この後の作業では特に不要ですが、発行されたQQの番号とパスワードは、Androidアプリの「QQ日本版」で使えます。
JIGUANG(极光) アカウントの作成
最初の画面
上から、アカウント、メアド、パスワードが2回です。
2つ目の画面
最初の4項目を入力すると、自動的に2つ目の項目が出ます。
上から、名前、会社名、電話番号、QQの番号(数値)、CAPTCHA
JPushサービスを登録する
JIGUANG(极光) https://www.jiguang.cn/ のサイトに行き、右上の「登录」でログインします。
ログイン後のメニューで、「开发者服务」>「极光推送」を選んで、次の画面で、「立即使用」を選択するとサービスの管理画面が開きます。
「创建应用」(アプリケーションの作成)を押します。
「应用名称」(アプケーション名)を入力します。「应用图标」(アプリケーションアイコン)はそのままで大丈夫です。今回はJPushTestAppで作成してみます。
「AppKye」と「Master Secret」に表示されている数値は後で使用します。
2つ目のブロックの「推送设置」を押します。
次の画面で、应用包名にパッケージを設定後に、「提交」を押すと「下载Demo」からデモアプリがダウンロードできるようになります。今回はパッケージ名を「com.grachro.chinapush」にしました。
ダウンロードしたファイルの名前は JPushExample(6桁くらいの数値).zip で、解凍するとGradle/Eclipse構成のAndroidプロジェクトでした。プロジェクトをAndroid Studio(Version 2.3.3)の「Import project(Eclipse ADT, Gradle, etc)」で開くと、、、なにやらプロジェクト構成系のエラーが出て先に進めませんでした。
Androidデモアプリ
Androidデモアプリを作る
ダウンロードしたプロジェクトをAndroid Studioで開けなかったので、新規のプロジェクトで動かしてみます。
Android Studioで、New Projectを作成します。プロジェクト名とパッケージは、JPushのサービスで登録したのと同じ、「JPushTestApp」と「com.grachro.chinapush」にします。ここは未検証ですが、別にしてもいいのかもしれません。その他はディフォルトのままにしました。
プロジェクトのスケルトンが作成できたら、先ほど解凍したJPushExample(xxxxxx)プロジェクトのファイルをコピペして移植してください。対象は5箇所です。
- AndroidManifest.xml(元のファイルは削除)
- src/main/java/以下すべて(元のファイルは削除)
- src/main/res以下すべて(元のファイルは削除)
- libのjarをlibへ
- libのjar以外の全てをsrc/main/jniLibsへ(jniLibsディレクトリは手動で作成)
移植が終わったら、Gradleリフレッシュをするとコンパイルが通ると思います。パッケージの辻褄が合わない等でコンパイルエラーになった場合は、手動で修正してください。AndroidManifest.xmlにJPUSH_APPKEYという項目がありますが、ここの値がサービス登録時に画面に表示されたAppKyeの値と一致しているハズです。
この状態で実機で動かすとアプリが立ち上がると思います。
Androidデモアプリの実行
起動したデモアプリで、「get_Registration_Id」をタップするとRegIdが割り振られます。
AndroidデモアプリへPush送信
JIGUANGのWebコンソールからデモアプリへPush送信
公式サイトからAndroidデモアプリへpush送信してみます。
ふたたびJIGUANG(极光)のサイトへ行き、登録したアプリのページで「发送通知」をクリックします。
「推送内容」「目标平台」「Registration ID」を入力します。「Registration ID」には、Android実機で割り振られたコードを入れてください。
「立即发送」>「发送吧!」の順にボタンを押すと、「推送成功,是否去查看推送记录?」のメッセージが表示されます。しばらくして、Android実機にpushメッセージが届くと成功です。
JavaアプリからAndroidデモアプリへPush送信
公式サイトhttp://docs.jiguang.cn/jpush/server/3rd/java_sdk/ を頼りにJavaクライアントを作ってみます。意外と言ってはなんですが、SDKはMavenのセントラルリポジトリに登録されています。GitHubで公開もされていました。
apply plugin: 'java'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile 'cn.jpush.api:jpush-client:3.3.0'
}
package sample;
import cn.jiguang.common.resp.APIConnectionException;
import cn.jiguang.common.resp.APIRequestException;
import cn.jpush.api.JPushClient;
import cn.jpush.api.push.PushResult;
import cn.jpush.api.push.model.Platform;
import cn.jpush.api.push.model.PushPayload;
import cn.jpush.api.push.model.audience.Audience;
import cn.jpush.api.push.model.audience.AudienceTarget;
import cn.jpush.api.push.model.notification.Notification;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SendApp {
private static Logger logger = LoggerFactory.getLogger(SendApp.class);
public static void main(String[] args) {
//<<masterSecret>>と<<appKey>>は、公式サイトの管理画面で確認できます。
JPushClient jpushClient = new JPushClient("<<masterSecret>>", "<<appKey>>");
//<<registrationId>>は、Android実機のデモアプリに払い出されたID
AudienceTarget target = AudienceTarget.registrationId("<<registrationId>>");
Audience audience = Audience.newBuilder().addAudienceTarget(target).build();
PushPayload payload = PushPayload.newBuilder()
.setPlatform(Platform.android())
.setAudience( audience)
.setNotification(Notification.android("from日本", "Hello🐼中国!!", nul)
.build();
try {
PushResult result = jpushClient.sendPush(payload);
logger.info("Got result - " + result);
} catch (APIConnectionException e) {
logger.error("Connection error, should retry later", e);
} catch (APIRequestException e) {
logger.error("Should review the error, and fix the request", e);
logger.info("HTTP Status: " + e.getStatus());
logger.info("Error Code: " + e.getErrorCode());
logger.info("Error Message: " + e.getErrorMessage());
}
}
}
JCenterのライブラリを使用して最小限の構成でアプリを作る
公式サイトのドキュメントを探すとAndroid SDKについてのマニュアルが見つかります。
https://docs.jiguang.cn/jpush/client/Android/android_sdk/
- Android SDK 概述 SDKの概要
- 3 分钟 Demo 3分デモ
- Android SDK 集成指南 Android SDKの統合ガイド
- Android SDK 调试指南 Android SDKのデバッグガイド
- Android SDK 进阶教程 Android SDKの高度なチュートリアル
- Android SDK API Android SDKのAPI
- Android SDK FAQ Android SDKのFAQ
このマニュアルを眺めていると、「Android SDK 集成指南」ページに、「jcenter 自动集成步骤」(jcenter自動積分ステップ)と、「手动集成步骤」(手動統合手順)という項目が見つかります。先ほどのデモアプリでjarファイルやAndroidManifest.xmlを移植しましたがこれは、手動に該当するようです。JCenterの自動の方が簡単そうなので試してみます。
1.デモアプリの時と同じように、Android Studioで、New Projectを作成
ディフォルトのままで特に設定変更不要です。
2.build.gradleにJPushの依存を追加
apply plugin: 'com.android.application'
android {
//中略
defaultConfig {
applicationId "com.grachro.chinapush.jpushminimum" //<<JPushサービス登録したパッケージに合わせる
//中略
//ndkを追加
ndk {
//选择要添加的对应cpu类型的.so库。
abiFilters 'armeabi', 'armeabi-v7a', 'armeabi-v8a'
// 还可以添加 'x86', 'x86_64', 'mips', 'mips64'
}
//manifestPlaceholdersブロックを追加
manifestPlaceholders = [
JPUSH_PKGNAME : applicationId,
JPUSH_APPKEY : "ここにAppKey", //JPush上注册的包名对应的appkey.
JPUSH_CHANNEL : "developer-default", //暂时填写默认值即可.
]
}
buildTypes {
//中略
}
}
dependencies {
//中略
compile 'cn.jiguang.sdk:jpush:3.0.3' // 此处以JPush 3.0.3 版本为例。 <<ここを追加
compile 'cn.jiguang.sdk:jcore:1.1.1' // 此处以JCore 1.1.1 版本为例。 <<ここを追加
}
- applicationIdを変更。
- ndkを追加。
- manifestPlaceholdersを追加。JPUSH_APPKEYを変更。
- dependenciesに2ライブラリ追加
3.アプリ起動時にJPushInterfaceを初期化
package com.grachro.chinapush.jpushminimum;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import cn.jpush.android.api.JPushInterface;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//3行追加
JPushInterface.setDebugMode(true);
JPushInterface.init(this);
Log.i("MainActivity",JPushInterface.getRegistrationID(this));
}
}
MainActivityで、JPushInterfaceを初期化して、RegistrationIDを取得します。RegistrationIDは、本来であればサーバーサイドで管理する必要がありますが、今回はデバッグログに出して終わりです。
4.サーバーサイドでPush送信
アプリを実機で起動して、先ほどと同じように、WebコンソールかJavaアプリからPush送信すると、アプリでPushが受け取れます。
Manifestファイルも一切変更しないでPushを受信できましたが、これでいいのでしょうか。。
最後に
送信対象をタグ付けしたり、AndroidでPushを受け取った場合の制御をしたりできると思われますが、今回はここで終了します。また調査が進んだら追記するか、別ページを作るかもしれません。