Я использую ниже php-код в Amazon ec2, php 7
<?php function sendApplePushNotificationMessage( $data, $message ) { global $notification; $apns_settings = $notification['apns_user']; $ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'local_cert', $apns_settings['pemFile']); $fp = stream_socket_client('ssl://gateway.'.(($apns_settings['environment'] == $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); if (!$fp) exit("Failed to connect amarnew: $err $errstr" . PHP_EOL); echo 'Connected to APNS' . PHP_EOL; $body['aps'] = array( 'alert' => $message, 'sound' => 'default' ); $payload = json_encode($body+$extra_values); $msg = chr(0) . pack('n', 32) . pack('H*', $data['token']) . pack('n', strlen($payload)) . $payload; $result = fwrite($fp, $msg, strlen($msg)); if (!$result) echo 'Message not delivered' . PHP_EOL; else echo 'Message successfully delivered '.$message. PHP_EOL; // Close the connection to the server fclose($fp); }
когда я вызываю эту функцию, я получил сообщение об успешном завершении.
Connected to APNS Message successfully delivered
Когда я пытаюсь использовать тот же файл pem и токен устройства для тестирования в Интернете, он работает правильно, но не работает на Amazon ec2 .
Вы используете службу APN
для отправки push-уведомлений. Он будет обращаться к портам 2195
и 2196
для отправки push-уведомлений с помощью TCPSocket
.
Ваша локальная система будет иметь доступ ко всем портам, и тогда проблем не будет.
Экземпляр EC2
по умолчанию не имеет доступа к этим портам. Вы можете разрешить / открыть эти порты в своих security groups
экземпляров ec2
.
Также разрешите порт 443
.
Альтернативой написанию собственной функции, вызывающей уведомление Apple Push, будет использование Amazon Simple Notification Service (SNS).
Amazon SNS может вызывать уведомления для iOS, Android, Baidu, Windows Mobile, рабочего стола Windows и рабочего стола Mac.
См .: Начало работы с Apple Push Notification Service