LoginSignup
2

More than 5 years have passed since last update.

posted at

updated at

[PHP]Amazon SNS を使い、iOS・AndroidへPUSH通知 - トピック作成・配信編 -

トピック操作

トピック作成

セグメント配信をする場合は単純な検索でない限り、一予約配信毎にトピックを作成して、トピックにエンドポイントを追加します。
配信するときにトピックを指定することで、そのトピックに登録されているエンドポイントに一斉配信できるようになります。

$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エンコードされたデータ

事前にトピックへエンドポイントを追加しておき、配信時間になったらトピックのエンドポイントに向けて一斉配信します。

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
What you can do with signing up
2