通过代理发送推送通知给APNS

我读过类似于我的不同的问题,但没有答案适合我:

$deviceToken = 'token'; $passphrase = 'passphrase'; $message = 'Questa è una notifica!'; //////////////////////////////////////////////////////////////////////////////// $ctx = stream_context_create(); $options = array('http' => array('proxy' => 'tcp://proxy.net:8080', 'request_fulluri' => true)); stream_context_create($options); stream_context_set_option($ctx, 'ssl', 'local_cert', 'cert.pem'); stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); // Open a connection to the APNS server $fp = stream_socket_client( 'ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); 

错误是

 Failed to connect: 110 Connection timed out 

我试图改变$选项值:

 $options = array('ssl' => array('proxy' => 'tcp://proxy.net:8080', 'request_fulluri' => true)); 

但没有任何工作,代理是绝对的最小,直接连接是不可能的。

有什么build议要问IT部门?

UPDATE

端口2195是开放的

如果您的代理支持CONNECT方法,您需要首先连接到代理,然后请代理将您连接到apns服务器,最后切换到SSL。

 $apns_settings = array( "host" => 'gateway.sandbox.push.apple.com', "port" => 2195, "certificate" => 'ipad.pem', "passphrase" => '', ); $proxy = 'proxyhttp:8080'; $context_options = array( 'ssl' => array( 'local_cert' => $apns_settings["certificate"], 'passphrase' => $apns_settings["passphrase"], 'peer_name' => $apns_settings["host"], 'SNI_server_name' => $apns_settings["host"], ), ); $stream_context = stream_context_create($context_options); // connection to your proxy server $apns = stream_socket_client('tcp://'.$proxy, $error, $errorString, 2, STREAM_CLIENT_CONNECT, $stream_context); // destination host and port must be accepted by proxy $connect_via_proxy = "CONNECT ".$apns_settings["host"].":".$apns_settings["port"]." HTTP/1.1\r\n". "Host: ".$apns_settings["host"].":".$apns_settings["port"]."\n". "User-Agent: SimplePush\n". "Proxy-Connection: Keep-Alive\n\n"; fwrite($apns,$connect_via_proxy,strlen($connect_via_proxy)); // read whole response and check successful "HTTP/1.0 200 Connection established" if($response = fread($apns,1024)) { $parts = explode(' ',$response); if($parts[1] !== '200') { die('Connection error: '.trim($response)); } else { echo "R:".$response.":R\n"; } } else { die('Timeout or other error'); } echo "Proxy opened communication...\n"; // switch to SSL encrypted communication using local certificate from $context_options if (stream_socket_enable_crypto($apns,true,STREAM_CRYPTO_METHOD_TLS_CLIENT)) echo "Switched to SSL OK...\n"; else die('some error in SSL negociation'); 

您可以在此之后使用正常的stream。

看看这里的代码: SimplePush.php的叉子