2015-09-28

ExactTargetのMobilePush試してみた【Android・前編】

ExactTargetのMobilePush(Android)を試してみたので備忘として残しておきます!

参考URL:Journey Builder for Apps Android SDK (v4.0.6) : README

1. Google Developers ConsoleでAPIキー登録

Server Keyを登録してAPIキーを取得し、プロジェクト番号をメモります。 詳細な方法は以下のURLを参照。

アンドロイドアプリからGoogle Cloud Messagingを使う方法(第1回)第2版

2. AppCenterでアプリケーション登録

AppCenterにログインしてPush用のアプリケーションを作成します。

etmc-appcenter-home

MobilePushを選択します。

etmc-appcenter-create

アプリの基本情報を入力します。

etmc-appcenter-create-push1

ユーザと紐付けます。

etmc-appcenter-create-push2

Google Developers Consoleで取得したServer Keyをセットします。

etmc-appcenter-create-push3

設定内容を確認して、Finishをクリックして完了です。

etmc-appcenter-create-push4

Application IDとAccess Tokenが払い出されるのでメモります。

etmc-appcenter-create-push5

3. Androidアプリの作成

Android StudioでFile>Newから新しいアプリを作成します。

etmc-android-app1

etmc-android-app2

etmc-android-app3

etmc-android-app4

作成されたアプリを以下のように修正します。

ETPushTest\build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.2.3'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
        maven {
            url "http://salesforcefuel.github.io/JB4A-SDK-Android/repository"
        }
    }
}

ETPushTest\app\build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        applicationId "com.freedom_man.etpushtest"
        minSdkVersion 19
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.0.1'

    // ET SDK
    compile 'com.exacttarget.etpushsdk:etsdk:4.0.6@aar'

    // Google Play Services for Location and Google Cloud Messaging
    compile 'com.google.android.gms:play-services-location:7.5.0'
    compile 'com.google.android.gms:play-services-gcm:7.5.0'

    // Google's Support v4 for Notification compatibility
    compile 'com.android.support:support-v4:22.2.0'

    // 3rd Party Libraries Required for SDK integration
    compile 'com.radiusnetworks:AndroidIBeaconLibrary:0.7.6'
}

ETPushTestApp.java

package com.freedom_man.etpushtest;

import android.app.Application;
import android.util.Log;

import com.exacttarget.etpushsdk.ETException;
import com.exacttarget.etpushsdk.ETPush;
import com.exacttarget.etpushsdk.ETPushConfig;
import com.exacttarget.etpushsdk.event.ReadyAimFireInitCompletedEvent;
import com.exacttarget.etpushsdk.util.EventBus;

/**
 * Created by freedom on 2015/09/23.
 */
public class ETPushTestApp extends Application {
    private static final String TAG = "ETPushTestApp";

    @Override
    public void onCreate() {
        super.onCreate();
        try {
            ETPush.readyAimFire(new ETPushConfig.Builder(this)
                            .setEtAppId(getString(R.string.et_app_id))
                            .setAccessToken(getString(R.string.et_access_token))
                            .setGcmSenderId(getString(R.string.gcm_sender_id))
                            .setAnalyticsEnabled(false)
                            .setPiAnalyticsEnabled(false)
                            .setLocationEnabled(false)
                            .setCloudPagesEnabled(false)
                            .setLogLevel(android.util.Log.VERBOSE)
                            .build()
            );
            EventBus.getInstance().register(this);
        } catch(ETException e) {
            Log.e(TAG, e.getMessage(), e);
        }
    }

    public void onEvent(ReadyAimFireInitCompletedEvent event) {
        if (ETPush.getLogLevel() <= Log.DEBUG) {
            Log.i(TAG, "ReadyAimFireInitCompletedEvent started.");
        }

        if (event.isReadyAimFireReady()) {
            // successful bootstrap with SDK


        } else {
            String message = "";
            // unsuccessful bootstrap with SDK
            if (event.getCode() == ETException.RAF_INITIALIZE_ENCRYPTION_FAILURE) {
                message = "ETPush readyAimFire() did not initialize due to an Encryption failure.";
            } else if (event.getCode() == ETException.RAF_INITIALIZE_ENCRYPTION_OPTOUT_FAILURE) {
                message = "ETPush readyAimFire() did not initialize encryption failure and unable to opt-out.";
            } else if (event.getCode() == ETException.RAF_INITIALIZE_EXCEPTION) {
                message = "ETPush readyAimFire() did not initialize due to an Exception.";
            } else {
                message = "ETPush readyAimFire() did not initialize due to an Exception.";
            }
            Log.e(TAG, String.format("ETPush readyAimFire() did not initialize due to an Exception with message: %s and code: %d", event.getMessage(), event.getCode()), event.getException());
            throw new RuntimeException(message);
        }
    }
}

ETPushTest\app\src\main\res\values\strings.xml

<resources>
    <string name="app_name">ETPushTest</string>

    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>
    <string name="et_app_id">{ExactTarget ApplicationID}</string>
    <string name="et_access_token">{ExactTarget AccessToken}</string>
    <string name="gcm_sender_id">{Google ProjectID}</string>
</resources>

{}内にはそれぞれGoogle Developers ConsoleやApp Centerで取得した値を入力してください。

ETPushTest\app\src\main\AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.freedom_man.etpushtest" >

    <!-- JB4A SDK Google Permissions -->
    <permission
        android:name="${applicationId}.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />
    <uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <!-- JB4A SDK Google Permissions -->

    <!-- ET SDK required permissions -->
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <!-- END ET SDK Required Permissions -->

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        android:name=".ETPushTestApp" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- ETPushReceiver and Service -->
        <receiver
            android:exported="true"
            android:name="com.exacttarget.etpushsdk.ETPushReceiver"
            android:permission="com.google.android.c2dm.permission.SEND">
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
                <action android:name="android.intent.action.ACTION_SHUTDOWN" />

                <category android:name="${applicationId}" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.BATTERY_LOW" />
                <action android:name="android.intent.action.BATTERY_OKAY" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_REPLACED" />
                <data android:scheme="package" />
            </intent-filter>
            <intent-filter>
                <action android:name="${applicationId}.MESSAGE_OPENED" />
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
        </receiver>

        <service
            android:name="com.exacttarget.etpushsdk.ETPushService"
            android:enabled="true" />
        <!-- ETPushReceiver and Service -->

        <!-- JB4A SDK Activity required for Cloud Page or Open Direct URLs sent from Marketing Cloud -->
        <activity
            android:name="com.exacttarget.etpushsdk.ETLandingPagePresenter"
            android:label="Landing Page" />
        <!-- JB4A SDK Activity required for Cloud Page or Open Direct URLs sent from Marketing Cloud -->

        <!-- Google Play Services version.  Using the resource file will require your project contain the Google Play services project. -->
        <!-- See Google documentation for more information -->
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
        <!-- Google Play Services version. -->
    </application>

</manifest>

アプリを起動すると、ETPush.readyAimFireでGCMに登録してデバイスIDが払い出され、Manifestに記載したserviceやreceiverがPushを受け取って処理を通知処理をしてくれます。EventBusに登録するとSDKでの各種イベントに対して処理を記述することが出来ます。上記のサンプルでは、readyAimFireが完了した時のイベントであるReadyAimFireInitCompletedEvent が発生した時の処理を記述しています。

メッセージの配信(WebUI)

ExactTargetのWebUIで配信する方法と、APIで送信する方法があります。 今回はWebUIで配信する方法を説明します。

まずはMobilePushのホーム画面にアクセスして、リストを作成します。

etmc-mobilepush-home

「リストの作成」ボタンをクリックします。

etmc-mobilepush-createlist

リストの情報とフィルタ条件を入力して、保存をクリックします。

etmc-mobilepush-createlist2

パブリッシュをクリックします。

etmc-mobilepush-createlist3

パブリッシュされた段階で、フィルタ条件に応じてリストの中身が更新されます。フィルタ条件に合致するデバイスが増減しても再度パブリッシュしない限りは更新されないようなので、リストを使って送信する場合は必ずパブリッシュしてから送信する必要があります。

etmc-mobilepush-createlist4

次にMobilePushのホーム画面からメッセージを作成します。アウトバウンドを選択します。

etmc-mobilepush-message1

メッセージの情報を入力します。

etmc-mobilepush-message2

メッセージ配信対象のリストを選択します。

etmc-mobilepush-message3

同画面の右下の方に「送信前に自動更新する」チェックがあるので、更新(=パブリッシュ)する場合はチェックを付けます。

etmc-mobilepush-message3_2

配信のタイミングを設定して送信をクリックします。

etmc-mobilepush-message4

すると、こんな感じでPush通知が来ます。

etmc-mobilepush-android-sample

このエントリーをはてなブックマークに追加