LoginSignup
3
5

More than 5 years have passed since last update.

JPushで中国国内のAndroid端末にプッシュ通知するための初期調査

Last updated at Posted at 2017-08-19

はじめに

免責

本記事は中国語サイトを自動翻訳しながら記述したものであり、内容が不正確であることをあらかじめご了承ください。本記事で記述されている、ネットワークサービスやライブラリの信頼性、セキュリティに関しても自己責任でご利用をお願いします。「斜め」の文字は、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

qq.jpg

NicknameとPasswordは、任意の値を入れてください。Telには、日本の国際番号81と携帯番号を入れます。携帯番号を1つしか持っていないので再確認できないのですが、上の3項目だけ入れれば、10桁くらいの数値のQQの番号がもらえたと思います。

この後の作業では特に不要ですが、発行されたQQの番号とパスワードは、Androidアプリの「QQ日本版」で使えます。

JIGUANG(极光) アカウントの作成

最初の画面

スクリーンショット 2017-08-18 18.37.16.png

上から、アカウント、メアド、パスワードが2回です。

2つ目の画面

スクリーンショット 2017-08-18 19.44.52.png

最初の4項目を入力すると、自動的に2つ目の項目が出ます。
上から、名前、会社名、電話番号、QQの番号(数値)、CAPTCHA

JPushサービスを登録する

スクリーンショット 2017-08-19 10.55.51.png
JIGUANG(极光) https://www.jiguang.cn/ のサイトに行き、右上の「登录」でログインします。

ログイン後のメニューで、「开发者服务」>「极光推送」を選んで、次の画面で、「立即使用」を選択するとサービスの管理画面が開きます。

jpush.jpg

「创建应用」(アプリケーションの作成)を押します。

スクリーンショット 2017-08-19 11.27.07.png

「应用名称」(アプケーション名)を入力します。「应用图标」(アプリケーションアイコン)はそのままで大丈夫です。今回はJPushTestAppで作成してみます。

jpush2.jpg

「AppKye」と「Master Secret」に表示されている数値は後で使用します。
2つ目のブロックの「推送设置」を押します。

スクリーンショット 2017-08-19 11.37.35.png

次の画面で、应用包名にパッケージを設定後に、「提交」を押すと「下载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」にします。ここは未検証ですが、別にしてもいいのかもしれません。その他はディフォルトのままにしました。

スクリーンショット 2017-08-19 15.10.14.png

プロジェクトのスケルトンが作成できたら、先ほど解凍した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デモアプリの実行

android.png

起動したデモアプリで、「get_Registration_Id」をタップするとRegIdが割り振られます。

AndroidデモアプリへPush送信

JIGUANGのWebコンソールからデモアプリへPush送信

公式サイトからAndroidデモアプリへpush送信してみます。

push.png
ふたたびJIGUANG(极光)のサイトへ行き、登録したアプリのページで「发送通知」をクリックします。
push.png

「推送内容」「目标平台」「Registration ID」を入力します。「Registration ID」には、Android実機で割り振られたコードを入れてください。

「立即发送」>「发送吧!」の順にボタンを押すと、「推送成功,是否去查看推送记录?」のメッセージが表示されます。しばらくして、Android実機にpushメッセージが届くと成功です。

JavaアプリからAndroidデモアプリへPush送信

公式サイトhttp://docs.jiguang.cn/jpush/server/3rd/java_sdk/ を頼りにJavaクライアントを作ってみます。意外と言ってはなんですが、SDKはMavenのセントラルリポジトリに登録されています。GitHubで公開もされていました。

build.gradle
apply plugin: 'java'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    compile 'cn.jpush.api:jpush-client:3.3.0'
}
SendApp.java
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());
        }
    }

}

実行するとデモアプリにpushメッセージが届きます。
push.jpg

JCenterのライブラリを使用して最小限の構成でアプリを作る

公式サイトのドキュメントを探すとAndroid SDKについてのマニュアルが見つかります。
https://docs.jiguang.cn/jpush/client/Android/android_sdk/

このマニュアルを眺めていると、「Android SDK 集成指南」ページに、「jcenter 自动集成步骤」(jcenter自動積分ステップ)と、「手动集成步骤」(手動統合手順)という項目が見つかります。先ほどのデモアプリでjarファイルやAndroidManifest.xmlを移植しましたがこれは、手動に該当するようです。JCenterの自動の方が簡単そうなので試してみます。

1.デモアプリの時と同じように、Android Studioで、New Projectを作成

ディフォルトのままで特に設定変更不要です。

2.build.gradleにJPushの依存を追加

app/build.gradle
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を初期化

MainActivity.java
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を受け取った場合の制御をしたりできると思われますが、今回はここで終了します。また調査が進んだら追記するか、別ページを作るかもしれません。

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5