通过代理向 APNS 发送推送通知 [英] Send Push Notification to APNS through proxy

查看:33
本文介绍了通过代理向 APNS 发送推送通知的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

i've read different question similar to mine, but no answer works for me:

$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 

我尝试使用以下方法更改 $option 值:

i've tried to change $option value with:

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

但没有任何效果,代理绝对是最小的,无法直接连接.

but nothing work, the proxy is absolutly minimal and direct connection are not possible.

有什么建议可以向 IT 部门询问吗?

Any suggestion about something to ask to IT division?

更新

2195端口开放

推荐答案

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

If your proxy support CONNECT method you need to connect first to the proxy then ask the proxy to connect you to apns server and finally switch up 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');

此后您可以正常使用流.

You can after this use the stream as normal.

在此处查看此代码:SimplePush.php 的分支

这篇关于通过代理向 APNS 发送推送通知的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆