2016-11-12 60 views
1

我使用下面的代码放在Amazon EC2的推送通知,PHP 7的Amazon EC2不能发送iOS上

<?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上无法正常工作。

+0

您是说当您在自己的计算机上运行此代码时,它可以成功运行,但它不能从Amazon EC2成功运行?什么是错误信息。您的EC2实例是否具有通过IAM角色分配的权限? –

+0

@JohnRotenstein是的,当我在godaddy专用的linux服务器上运行这段代码,然后成功地发送通知消息。但是当我在EC2中运行此代码时,我收到了响应消息,如“连接到APNS 消息已成功发送”,但通知消息未传递给ios设备。 –

+0

@JohnRotenstein对不起,你的意思是“EC2实例有通过IAM角色分配的权限?” –

回答

2

您正在使用APN服务发送推送通知。它将访问端口2195 & 2196在内部使用TCPSocket发送推送通知。

您的本地系统将有权访问所有端口,那么将没有问题。

EC2实例默认情况下无法访问这些端口。您可以在ec2实例security groups中允许/打开这些端口。

也允许端口443

+0

它在入站规则? –

+0

@Maulik:是的确切 – Ranzit

+0

嘿那有效吗? – Ranzit

0

可以使用Amazon Simple Notification Service(SNS)来编写自己的函数以产生Apple推送通知。

亚马逊SNS可以将通知推送到iOS,Android,百度,Windows移动,Windows桌面和Mac桌面。

请参见:Getting Started with Apple Push Notification Service

+0

您是对的亚马逊SNS是这种替代方式,但我需要知道EC2服务器有什么问题或者为什么这个代码不能传递消息? –