2015-10-05

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

前回はWebのUI上からPush通知をしましたが、今回はAPIで送信してみます。 APIで送信するには事前にApp Centerのアプリケーション登録が必要です。 こちらの記事を参照して事前にセットアップしてください。

参考URL

API用のメッセージの作成

前回はスケジュール配信用のメッセージを作成しましたが、今回は以下のようにAPI用のメッセージを作成します。

etmc-mobilepush-message-api1

作成したらメッセージIDをメモります。

etmc-mobilepush-message-api2

認証

App Centerで登録したClientIDとClientSecretを使って以下のリクエストをします。

$ curl -i -X POST \
   -H "Content-Type:application/json" \
   -d \
'{
  "clientId": "{client_id}",
  "clientSecret": "{client_secret}"
}' \
 'https://auth.exacttargetapis.com/v1/requestToken'

レスポンスはこんな感じで、access_tokenをAPIコールに利用します。

{
  "accessToken": "***************",
  "expiresIn": 3600
}

リストで送信

前回同様に予め作成したリストに対して送信してみます。リクエストにはリストIDが必要なので、MobilePushのトップの「連絡先の追加」から対象のリストを選択して、「リストID」をメモります。

etmc-mobilepush-listdetail

リストに対するPush通知リクエストはこんな感じです。

$ curl -i -X POST \
   -H "Content-Type:application/json" \
   -H "Authorization:Bearer {access_token}" \
   -d \
'{
  "inclusionListIds":["{list_id}"]
}' \
 'https://www.exacttargetapis.com/push/v1/messageList/{message_id}/send'

レスポンスは以下のようにトークンが返って来ます。他のPushリクエストでも同様で、このトークンを使って配信結果を取得することが出来ます。

{
  "tokenId": "e85578ec-5a07-4eb2-b958-d4f1bd870621"
}

リスト配信時の配信結果の取得リクエストは以下のとおり

$ curl -i -X GET \
   -H "Content-Type:application/json" \
   -H "Authorization:Bearer {access_token}" \
 'https://www.exacttargetapis.com/push/v1/messageList/{message_id}/deliveries/{token_id}'

レスポンスはこんな感じ

{
  "message": {
    "id": "{message_id}"
  },
  "completeDate": "2015-10-03T05:43:26",
  "count": 3,
  "createDate": "2015-10-03T05:43:01.68",
  "status": "Finished"
}

リストの更新もAPIで可能です。

$ curl -i -X POST \
   -H "Content-Type:application/json" \
   -H "Authorization:Bearer {access_token}" \
   -d \
'' \
 'https://www.exacttargetapis.com/push/v1/contacts/refreshList/{list_id}'

タグで送信

各デバイスには、Push配信する条件として利用する属性値としてタグを設定することができます。一つのデバイスに複数のタグを設定可能です。AndroidのSDKだと以下のようにしてタグを登録・登録解除することが出来ます。

ETPush.getInstance().addTag("hoge");
ETPush.getInstance().removeTag("hoge");

特定のタグが付与されたデバイスに対してPush通知をするリクエストのサンプルはこちら↓

$ curl -i -X POST \
   -H "Content-Type:application/json" \
   -H "Authorization:Bearer {access_token}" \
   -d \
'{
  "InclusionTags": ["HogeHoge","FugaFuga"]
}' \
 'https://www.exacttargetapis.com/push/v1/messageTag/{message_id}/send'

ちなみにタグは複数指定できますが、全てOR条件として評価されるっぽいです。

デバイストークンで送信

端末、アプリで一意なデバイストークンを使ってPush通知が可能です。Androidの場合、デバイストークンは以下のメソッドで取得可能です。

ETPush.getInstance().getSystemToken();

デバイストークンで送信するリクエストのサンプルはこちら↓

$ curl -i -X POST \
   -H "Content-Type:application/json" \
   -H "Authorization:Bearer {access_token}" \
   -d \
'{
  "DeviceTokens": [
    "{device_token}"
  ]
}' \
 'https://www.exacttargetapis.com/push/v1/messageContact/{message_id}/send'

SubscriberKeyで送信

SubscriberKeyとはユーザ(購読者)に対して一意に割り当てられるキーになります。複数のデバイスに対して一つのSubscriberKeyを割り当てることできます。これにより、1回のAPIコールで同一ユーザの複数デバイスに対してPush通知を送信することが可能です。

SubscriberKeyの設定、取得は以下のような感じで

ETPush.getInstance().setSubscriberKey("hogehogekey");

SubscriberKeyでPushするリクエストのサンプルはこちら↓

$ curl -i -X POST \
   -H "Content-Type:application/json" \
   -H "Authorization:Bearer {access_token}" \
   -d \
'{
    "SubscriberKeys": [
        "{subscriber_key}"
    ]
}' \
 'https://www.exacttargetapis.com/push/v1/messageContact/{message_id}/send'

メッセージのオーバーライド

予め作成したメッセージの本文や後述のOpenDirect、CustomKey等の設定をオーバーライドしてPush通知することができます。SubscriberKeyを使ったPush通知だと以下のような感じ。

$ curl -i -X POST \
   -H "Content-Type:application/json" \
   -H "Authorization:Bearer {access_token}" \
   -d \
'{
    "SubscriberKeys": [
        "{subscriber_key}"
    ],
    "Override": true,
    "MessageText": "FUGAFUGA!!",
    "CustomKeys": {
        "keyA": "keyA_value"
    }
}' \
 'https://www.exacttargetapis.com/push/v1/messageContact/{message_id}/send'

JSONの属性にOverride:trueを付与してオーバーライドができます。

Push時の挙動の変更

SDKのデフォルトではPush通知を受けると自動的にダイアログが表示され、ダイアログをクリックした時は対象のアプリケーションに遷移しますが、これらの挙動を変更することが出来ます。

ダイアログの変更は以下のようにして行います。NotificationCompat.Builderで色々設定したのを返せばOKです。

ETNotifications.setNotificationBuilder(new ETNotificationBuilder() {
    @Override
    public NotificationCompat.Builder setupNotificationBuilder(Context context, Bundle payload) {
        // Allow the SDK to setup the builder
        NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext());
        builder.setSmallIcon(R.drawable.icon);
        builder.setContentText("HOGE");
        return builder;
    }
});

クリックした時の挙動(=Intent)は以下のようにして変更します。以下は通知をクリックしたらgoogleにブラウザで遷移するサンプルです。

ETNotifications.setNotificationLaunchIntent(new ETNotificationLaunchIntent() {
    @Override
    public Intent setupLaunchIntent(Context context, Bundle payload) {
        return new Intent(Intent.ACTION_VIEW,"https://www.google.co.jp");
    }
});

setNotificationLaunchIntent以外にもオーバーライドする方法はありますので、詳細はコチラを参照してください。

CustomKey

メッセージペイロード以外にカスタムキーとしてメタデータを付与することが出来ます。通知時の挙動を分岐させる等の用途で利用します。

こちらの機能を有効化するにはMobilePushの「管理」から対象のアプリケーションをクリックして設定する必要があります。

etmc-mobilepush-setting1

後述のOpenDirectに関してもこの画面で設定します。

etmc-mobilepush-setting2

こちらで設定したカスタムキーのみ利用することが可能で、APIで動的に設定したカスタムキーに関しては無視されるので注意して下さい。

OpenDirect

SDK側でオーバーライドせずに、デフォルトの状態でOpenDirectを設定して、Pushの通知をクリックすると、OpenDirectに設定したURLに自動的に遷移します。この時、URLを開くアプリケーション(Activity)はSDKが保持しているActivityになるので表示はWebViewになります。Intentをオーバーライドしている場合はOpenDirectの設定は意味が無いです。

ペイロードの最大長

ペイロードの最大長は各OSに依存します。ただ、上記のCustomKeyやOpenDirect等の設定値もペイロードに含まれるのと、全く何も含めない状態でもある程度のオーバーヘッドがあることを考慮する必要があります。iOS7以下に対応するのであれば全角で40~50文字くらいですかね。

参考URL:iOSのPUSH通知(APNS)の特徴・ノウハウまとめ(iOS 9まで対応) - Qiita

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