トピック操作
トピック作成
セグメント配信をする場合は単純な検索でない限り、一予約配信毎にトピックを作成して、トピックにエンドポイントを追加します。
配信するときにトピックを指定することで、そのトピックに登録されているエンドポイントに一斉配信できるようになります。
$result = $sns->createTopic(array(
'Name' => $topic_name
));
// トピックARNを取得
$topic_arn = $result['TopicArn'];
・Name
トピック名を入れます。
既に登録されているトピック名でも成功のレスポンスが返ってきますが、複数データが生成されるわけではないので、ユニークな名前を付けた方がいいです。
取得したトピックARNはDBに保存しておきましょう!
抽出したエンドポイントをトピックに追加する場合は、前回の記事の「ALLトピックに追加」をループで回して追加します。
複数のエンドポイントを一気に追加できない仕様のようなので、件数が多い場合はこの部分が一番ネックになります。
環境にもよりますが1時間で2万件くらいです。
エラー発生を考慮
try {
// エンドポイントをトピックに登録
$sns->subscribe(array(
'Endpoint' => $sns_endpoint,
'Protocol' => 'Application',
'TopicArn' => $topic_arn
));
} catch (Exception $e) {
$message = $e->getMessage();
$pos = strpos($message, 'Endpoint does not exist');
if ($pos !== false) {
// トークンとエンドポイントの削除処理など
}
}
エンドポイントが存在しない場合などエラーが発生します。
その場合はエラーメッセージに「Endpoint does not exist」という文言があれば、DBからトークンやエンドポイントを削除などの処理をするといいと思います。
トピック削除
$sns->deleteTopic(array(
'TopicArn' => $topic_arn
));
・TopicArn
トピック作成時に取得したトピックARN
削除するとトピックに登録されているエンドポイントも削除されます。
トピックに登録されているエンドポイントへ一斉配信
APNs JSONデータ作成
$apns = json_encode(array(
'aps' => array(
'alert' => array(
'body' => $body
),
'sound' => 'default',
'badge' => 'default',
'category' => null
),
'url' => $url,
'push_id' => $push_id
));
・body
配信するメッセージ
・url、push_id
カスタムkeyです。
アプリで通知を開いたときにWebViewを表示させたい場合や開封率を計測した場合など、自由にkeyとvalueを設定できます。
GCM JSONデータ作成
$gcm = json_encode(array(
'data' => array(
'message' => $body,
'url' => $url,
'push_id' => $push_id
)
));
・message
配信するメッセージ
・url、push_id
カスタムkeyです。
アプリで通知を開いたときにWebViewを表示させたい場合や開封率を計測した場合など、自由にkeyとvalueを設定できます。
Message作成
$message = json_encode(array(
'default' => $body,
'APNS' => $apns,
'GCM' => $gcm
));
・APNS
本番 または Ad Hoc用であればAPNS、開発用であればAPNS_SANDBOX
例ではiOS、Android両方同時に送っていますが、どちらか片方への送信であれば、送信しない方のデータは作成しなくても問題ありません。
配信実行
$json = array(
'MessageStructure' => 'json',
'TargetArn' => $topic_arn,
'Message' => $message
);
// 配信実行
$sns->publish($json);
・MessageStructure
JSON固定
・TargetArn
トピック作成時に取得したトピックARN
特定のデバイスのみ送りたい場合は、プラットフォームエンドポイント
・Message
JSONエンコードされたデータ
事前にトピックへエンドポイントを追加しておき、配信時間になったらトピックのエンドポイントに向けて一斉配信します。