我已经建立了一个转发/调度服务,它按照苹果的声明/推荐与APN保持开放连接,以防止DoS检测并且证书正在运行......
我连接成功,消息发送成功,但iOS设备(iPhone)上没有收到消息......(?!?)发送的字节数等于fwrite返回的字节数(字节数).
最后,消息可能包含国家/地区特定字符.APN如何处理?以及如何将这些字符发送到APNs服务器?
无论是否有转发服务,我都试过了,但没有运气.:-(
所有对日志的调用都会在代码段中删除,以避免混淆.这意味着粘贴的日志消息无法直接映射到代码片段,但应该可以"猜测"日志消息的来源.
请帮我解决这些问题.提前致谢
以这种方式建立连接:
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', $certPath);
stream_context_set_option($ctx, 'ssl', 'passphrase', $passPhrase);
$this->apn_link = stream_socket_client($url, $err, $errstr, 60, STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT, $ctx);
/* ... */
Run Code Online (Sandbox Code Playgroud)
在侦听转发服务的套接字的循环内:
foreach ($changed as $changed_socket) {
while(isset($changed_socket) && socket_recv($changed_socket, $buf, 1024, 0) >= 1)
{
$buf = trim($buf);
if ($buf != '') {
$this->msg2apn($buf);
}
}
}
/* ... */
Run Code Online (Sandbox Code Playgroud)
我还以这种方式发送消息:
public function msg2apn($msg) {
if (isset($this->apn_link)) {
while(!$result = fwrite($this->apn_link, $msg, strlen($msg))) {
usleep(400000); //400 msec
}
if …Run Code Online (Sandbox Code Playgroud)