我的推动通知正常。但是在某些时候,从无处开始就开始出现错误:
stream_socket_client():SSL:连接重置peer
奇怪的是,我不必做任何事情来解决它,而是等待。 一段时间后,它重新开始工作。
我知道这是许多问题的重复,例如:通知式 - ios-os-os-connection-by-Peer但是他们都没有解决我的问题。
我正在使用php stream_socket_client生成套接字连接
使用的代码是:
<?php
ini_set('display_errors','On');
error_reporting(E_ALL);
$deviceToken= 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
$passphrase = ' ';
$message = 'my first notification';
////////////////////////////////////////////////////////////////////////////////
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.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);
if (!$fp)
exit("Failed to connect: $err $errstr" . PHP_EOL);
echo 'Connected to APNS' . PHP_EOL;
// Create the payload body
$body['aps'] = array(
'alert' => $message,
'sound' => 'default'
);
// Encode the payload as JSON
$payload = json_encode($body);
// Build the binary notification
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));
if (!$result)
echo 'Message not delivered' . PHP_EOL;
else
echo 'Message successfully delivered' . PHP_EOL;
// Close the connection
}
我真的无法将手指放在主要原因上。
,但请确保您没有做错任何事情:
- 在并行中不要进行很多连接。发出推送通知后,重复使用相同的连接或关闭连接。实际上,服务器具有最大并行连接数量的限制,一旦您达到阈值,这可能会使您陷入困境。苹果还建议将连接保持打开状态,除非您知道它会闲置。
在多个通知中保持与APN的连接; 不要反复打开并关闭连接。APN可以快速处理 连接和断开连接是拒绝服务的攻击。你应该 除非您知道它会闲置,否则请保持连接 长时间的时间 - 例如,如果您仅将通知发送到 您的用户每天一次使用新连接。
- 不要将开发人员配置文件令牌发送到实时APN。保持分发和开发应用程序令牌分开。如果您尝试将沙箱令牌发送到实时APN,反之亦然,则可能导致错误。
在这一方面挣扎了一段时间。对于我的情况,事实证明是:
a)和过期的APNS证书。只有很小比例的错误解释了它是过期的证书。大多数是"连接重置"。
b)损坏的APNS证书。只有在再生证书后才开始工作。在此之前,我再次获得了臭名昭著的"连接重置"。