web-dev-qa-db-fra.com

Envoi d'Amazon SNS à partir de mon PHP serveur

J'ai une application sur les plateformes Android et iOS. Les deux sont enregistrés auprès d'Amazon SNS. Cette opération a abouti, car si je dispose des jetons de périphérique, je peux alors me connecter à mon tableau de bord des applications sur Amazon et envoyer des SNS à partir de leur console.

Je veux que ça soit automatisé. Je veux dire avoir mon propre site administrateur PHP (et API) pour les applications. Je souhaite ajouter une autre page au site d'administration, pouvant demander à Amazon SNS d'envoyer une seule charge utile avec l'identificateur de périphérique, les clés d'enregistrement et le corps du message fourni avec la demande.

Première question - Est-ce possible? J'ai vu Urban Airship le permettre, il est donc courant qu'Amazon le fasse aussi?

Deuxième question - Quel est le processus? Depuis que je travaille dessus pour un de mes clients et que tous les documents ne sont pas accessibles pour moi. Mon client est incapable de l'expliquer à Amazon.

Une fois mes applications enregistrées sur Amazon, ne devraient-elles pas me fournir des clés et des secrets que je peux utiliser pour appeler leur service via http?

15
zinnuree

Oui, c'est possible. Téléchargez le Amazon Web Service (AWS) PHP SDK de ici / et suivez les instructions pour l'utiliser dans votre API de serveur Web. Obtenez les ARN de l'application de plate-forme pour iOS et Android, l'ID de clé d'accès et la clé secrète de la console Amazon. Et ensuite, essayez le code ci-dessous et suivez les instructions commentées:

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

Le code est testé et fonctionne, n'hésitez pas à changer selon vos besoins.

26
Shabib

Si vous souhaitez envoyer une alerte sonore et un numéro de badge avec une charge utile personnalisée, remplacez ce bloc de code // iOS: Send a message to each endpoint foreach ($iOS_model['Endpoints'] as $endpoint)

avec ce bloc de code

    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
    }
}
4
Alex McPherson

je crois que le moyen le plus simple d'envoyer une notification Push à un seul périphérique ou à un seul utilisateur est d'utiliser ce code.

                $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