私のPHPサーバーからAmazonSNSを送信する
AndroidとiOSプラットフォームの両方にアプリケーションがあります。どちらもAmazonSNSに登録されています。デバイストークンがあれば、アプリケーションダッシュボードにログインできるため、これは正常に実行されます。 Amazonで、コンソールからSNSを送信できます。
自動化してほしい。つまり、アプリケーション用に独自のPHP管理サイト(およびAPI)を持っているということです。管理サイトに別のページを追加して、AmazonSNSにデバイス識別子と登録を含む単一のペイロードを送信するように要求できるようにします。リクエストで提供されるキーとメッセージ本文。
最初の質問-それは可能ですか?アーバンエアシップがそれを許可しているのを見たことがありますが、Amazonも許可しているのが普通ですか?
2番目の質問-プロセスは何ですか?私はクライアントの1人のためにこれに取り組んでおり、すべてのドキュメントにアクセスできるわけではないためです。私のクライアントはそれをAmazonに説明することができません。
アプリをAmazonに登録したときに、http経由でサービスを呼び出すために使用できるいくつかのキーとシークレットを提供してくれませんか?
はい、可能です。アマゾンウェブサービス(AWS)PHP SDK from here をダウンロードし、指示に従ってWebサーバーAPIでこれを使用します。iOSと両方のプラットフォームアプリケーションARNを入手します。 Android、AmazonコンソールからキーIDとシークレットキーにアクセスします。次に、以下のコードを試して、コメントアウトされた手順に従います。
<?php
require '<path to this file>/aws.phar';
use Aws\Sns\SnsClient;
if(isset($_POST['submit']))
{
$Push_message = $_POST['Push_message'];
if(!empty($Push_message))
{
// Create a new Amazon SNS client
$sns = SnsClient::factory(array(
'key' => '<access key>',
'secret' => '<app secret>',
'region' => '<region code>'
));
// region code samples: us-east-1, ap-northeast-1, sa-east-1, ap-southeast-1, ap-southeast-2, us-west-2, us-gov-west-1, us-west-1, cn-north-1, eu-west-1
$iOS_AppArn = "<iOS app's Application ARN>";
$Android_AppArn = "<Android app's Application ARN>";
// Get the application's endpoints
$iOS_model = $sns->listEndpointsByPlatformApplication(array('PlatformApplicationArn' => $iOS_AppArn));
$Android_model = $sns->listEndpointsByPlatformApplication(array('PlatformApplicationArn' => $Android_AppArn));
// Display all of the endpoints for the iOS application
foreach ($iOS_model['Endpoints'] as $endpoint)
{
$endpointArn = $endpoint['EndpointArn'];
echo $endpointArn;
}
// Display all of the endpoints for the Android application
foreach ($Android_model['Endpoints'] as $endpoint)
{
$endpointArn = $endpoint['EndpointArn'];
echo $endpointArn;
}
// iOS: Send a message to each endpoint
foreach ($iOS_model['Endpoints'] as $endpoint)
{
$endpointArn = $endpoint['EndpointArn'];
try
{
$sns->publish(array('Message' => $Push_message,
'TargetArn' => $endpointArn));
echo "<strong>Success:</strong> ".$endpointArn."<br/>";
}
catch (Exception $e)
{
echo "<strong>Failed:</strong> ".$endpointArn."<br/><strong>Error:</strong> ".$e->getMessage()."<br/>";
}
}
// Android: Send a message to each endpoint
foreach ($Android_model['Endpoints'] as $endpoint)
{
$endpointArn = $endpoint['EndpointArn'];
try
{
$sns->publish(array('Message' => $Push_message,
'TargetArn' => $endpointArn));
echo "<strong>Success:</strong> ".$endpointArn."<br/>";
}
catch (Exception $e)
{
echo "<strong>Failed:</strong> ".$endpointArn."<br/><strong>Error:</strong> ".$e->getMessage()."<br/>";
}
}
}
}
?>
コードはテストされ、機能します。必要に応じて自由に変更してください。
カスタムペイロードでアラートサウンドとバッジ番号を送信する場合は、このコードブロックを置き換えます// iOS: Send a message to each endpoint foreach ($iOS_model['Endpoints'] as $endpoint)
このコードブロックで
foreach ($iOS_model['Endpoints'] as $endpoint)
{
$endpointArn = $endpoint['EndpointArn'];
try
{
$sns->publish(array(
'TargetArn' => $endpointArn,
'MessageStructure' => 'json',
'Message' => json_encode(array(
'default' => $title,
'APNS_SANDBOX' => json_encode(array(
'aps' => array(
'alert' => $title,
'sound' => 'default',
'badge' => 1
),
// Your custom payload if needed
'whatever' => 'here',
'andwhatever' => 'here'
))
))
));
echo "1";//Success Push
}
catch (Exception $e)
{
echo "2";//Failed Push
}
}
プッシュ通知を単一のデバイスまたはユーザーに送信する最も簡単な方法は、このコードによると思います
$snsClient = Aws\Sns\SnsClient::factory(array(
'credentials' => array(
'key' => Amazon_KEY,
'secret' => Amazon_SECRET,
),
'region' => Amazon_REIGON
));
//you should have variable that have user end single point .
$result = $snsClient->publish(array(
'Message' => "Push text message",
'TargetArn' => $user_end_point
));