Отправка Amazon SNS с моего PHP-сервера
У меня есть приложение как на платформах Android, так и на iOS. Оба они зарегистрированы в Amazon SNS. Это успешно сделано, потому что, если у меня есть токены устройства, я могу войти в панель управления приложениями в Amazon и отправлять SNS с их консоли.
Я хочу, чтобы это было автоматизировано. Я имею в виду, что у меня есть собственный сайт администратора PHP (и API) для приложений. Я хочу добавить еще одну страницу на сайт администратора, которая может запросить amazon SNS для отправки одной полезной нагрузки с устройством идентификатор, регистрационные ключи и текст сообщения, предоставленные вместе с запросом.
Первый вопрос - Возможно ли это? Я видел, что городской дирижабль позволяет это, так что обычно амазонка тоже это делает?
Второй вопрос - Что это за процесс? Так как я работаю над этим для одного из моих клиентов, и все документы мне недоступны. Мой клиент не может объяснить это amazon.
Когда я зарегистрирую свои приложения на amazon, не должны ли они предоставить мне некоторые ключи и секреты, которые я могу использовать для позвонить в их службу по http?
3 answers
Да, это возможно. Загрузите PHP SDK Amazon Web Service (AWS) из здесь и следуйте инструкциям, чтобы использовать его в API вашего веб-сервера. Получите приложение платформы ARN для 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'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
}
}
Я считаю, что самый простой способ отправить 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
));