2013-07-03 82 views
0

发送推送通知到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)); 

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

对IT部门有什么建议?

UPDATE

端口2195是开放

+0

你为什么连接在端口9999 proxy.net?那里有代理吗?你能从服务器连接到端口9999吗? –

+0

没有好的端口是8080,它只是一个假端口,但是我改变它 – Lucabro

+0

一个典型的web代理通常运行在端口8080.你需要一个透明的代理(网关)。 –

回答

2

如果您的代理支持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'); 

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

看一看这个代码在这里:Fork of SimplePush.php