[aws/php] AWS SDK for PHP + AWS SNSを使用してAPNsをiOSデバイスに送信する方法

AWS SDK for PHP + AWS SNSを使用してAPNsをiOSデバイスに送信する方法は以下の通り

前提条件:アプリ側、AWS SNSなどの通知環境は既に構築済みとする

通知環境構築は下記記事参照

[AWS/Swift4] AWS SNS + Cognito + iOS10でサーバレスでAPNsをpushする方法

 

目次

AWS SDK for PHPの導入

bitnamiのphp環境にAWS SDK for PHPを導入する

通知を実行するファイルの横、もしくは~/apps/wordpress/htdocsに移動する

Composerを使用してインストール

curl -sS https://getcomposer.org/installer | php
php composer.phar require aws/aws-sdk-php

正常にインストールされると、コマンドを発行したフォルダにvenderというフォルダができているはず。

 

phpコード

APNs通知発行依頼をAWS SNSに対して発行するには以下のコードを実装

前もって、AWS SNSに対してアクセス権を持っているAWS IAMユーザを作成しておき、アクセスキー・シークレットキーを発行しておく。

<?php
 
require 'vendor/autoload.php';
use Aws\Sns\SnsClient;
 
$sns = SnsClient::factory(array(
 'version' => 'latest',
 'key' => 'AWS SNSへのアクセス権を持っているIAMのアクセスキー',
 'secret' => 'AWS SNSへのアクセス権を持っているIAMのシークレットキー',
 'region' => 'ap-northeast-1'//リージョン名
 ));
 
$iOS_AppArn = 'AWS SNSのアプリケーションARN'; 
 
$iOS_model = $sns->listEndpointsByPlatformApplication(array('PlatformApplicationArn' => $iOS_AppArn));
 
//通知メッセージ
$alert="AWS SNSより発行";
 
// それぞれのエンドポイントへメッセージを送る
foreach ($iOS_model['Endpoints'] as $endpoint)
 {
 $endpointArn = $endpoint['EndpointArn'];
 try
 {
 $sns->publish(array(
 'TargetArn' => $endpointArn,
 'MessageStructure' => 'json',
 'Message' => json_encode(array(
 'APNS_SANDBOX' => json_encode(array(
 'aps' => array(
 'alert' => $alert,
 'sound' => 'default',
 'badge' => 1
 ),
 // カスタム
 'custom_text' => "カスタムテキスト",
 ))
 ))
 ));
 echo "ok";
 }
 catch (Exception $e)
 {
 $e->getMessage();
 }
 }
 
?>

ブラウザで該当ファイルにアクセスすると通知が飛ぶ。

ちなみに「$sns->listEndpointsByPlatformApplication」で取得できるendpoint数は100が最大で、100以上endpointが登録されている場合は、返り値に「NextToken」が付いている。

そのNextTokenを指定して再度取得すると次の100件のendpointが取得できる。

do {
 // We only get 100 subscribers, if there's a nextToken, get the next 100
 if( $nextToken ) {
 $result = $client->listEndpointsByPlatformApplication(array(
 'PlatformApplicationArn' => $gcm_arn,
 'NextToken' => $nextToken
 ));
 } else {
 // Run this the first time, since there's no nextToken yet
 $result = $client->listEndpointsByPlatformApplication(array(
 'PlatformApplicationArn' => $gcm_arn
 ));
 }

 $nextToken = $result['NextToken'];

} while( $nextToken );

参考:https://gist.github.com/scottopolis/df0e42b02c39564dc21b

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です