web-dev-qa-db-ja.com

私のPHPサーバーからAmazonSNSを送信する

AndroidとiOSプラットフォームの両方にアプリケーションがあります。どちらもAmazonSNSに登録されています。デバイストークンがあれば、アプリケーションダッシュボードにログインできるため、これは正常に実行されます。 Amazonで、コンソールからSNSを送信できます。

自動化してほしい。つまり、アプリケーション用に独自のPHP管理サイト(およびAPI)を持っているということです。管理サイトに別のページを追加して、AmazonSNSにデバイス識別子と登録を含む単一のペイロードを送信するように要求できるようにします。リクエストで提供されるキーとメッセージ本文。

最初の質問-それは可能ですか?アーバンエアシップがそれを許可しているのを見たことがありますが、Amazonも許可しているのが普通ですか?

2番目の質問-プロセスは何ですか?私はクライアントの1人のためにこれに取り組んでおり、すべてのドキュメントにアクセスできるわけではないためです。私のクライアントはそれをAmazonに説明することができません。

アプリをAmazonに登録したときに、http経由でサービスを呼び出すために使用できるいくつかのキーとシークレットを提供してくれませんか?

16
zinnuree

はい、可能です。アマゾンウェブサービス(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/>";
            }
        }
    }
}   
?>

コードはテストされ、機能します。必要に応じて自由に変更してください。

28
Shabib

カスタムペイロードでアラートサウンドとバッジ番号を送信する場合は、このコードブロックを置き換えます// 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
    }
}
5
Alex McPherson

プッシュ通知を単一のデバイスまたはユーザーに送信する最も簡単な方法は、このコードによると思います

                $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
                ));
0
albaiti