Отправка ASA Amazon с моего PHP-сервера

У меня есть приложение как на платформах Android, так и на iOS. Оба они зарегистрированы в Amazon SNS. Это успешно сделано, потому что, если у меня есть токены устройства, я могу войти в панель приложений своих приложений в Amazon и отправить SNS с консоли.

Я хочу, чтобы он стал автоматическим. Я имею в виду иметь собственный PHP-сайт администратора (и API) для приложений. Я хочу добавить еще одну страницу на сайт администратора, который может запросить SNS amazon для отправки единой полезной нагрузки с идентификатором устройства, регистрационными ключами и телом сообщения, предоставленным с запросом.

Первый вопрос - возможно ли это? Я видел, что Urban Airship позволяет это, так что обычно и амазонка тоже?

Второй вопрос - что это за процесс? Поскольку я работаю над этим для одного из моих клиентов, и все документы не доступны мне. Мой клиент не может объяснить это амазонке.

Когда я зарегистрировал свои приложения на амазонке, не должны ли они предоставить мне несколько ключей и секретов, которые я могу использовать для вызова их службы через http?

Ответы

Ответ 1

Да, это возможно. Загрузите SDK SDK Amazon (AWS) из здесь и следуйте их инструкциям, чтобы использовать это в своем API веб-сервера. Получите приложение ARNA для платформы как для iOS, так и для Android, ключ доступа и секретный ключ от консоли Amazon. Затем попробуйте выполнить приведенный ниже код и следуйте инструкциям:

<?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 Application ARN>";
        $android_AppArn = "<android app Application ARN>";

        // Get the application 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/>";
            }
        }
    }
}   
?>

Код протестирован и работает, не стесняйтесь меняться по мере необходимости.

Ответ 2

Если вы хотите отправить звуковой сигнал оповещения и номер значка с пользовательской полезной нагрузкой, замените этот блок кода // 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
    }
}

Ответ 3

Я считаю, что самый простой способ отправить 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
                ));