APNS + PHP - 无法为超过200个令牌传递消息

时间:2015-05-07 08:04:24

标签: php apple-push-notifications

我可以向APNS发送有关我数据库中前200个设备令牌的通知,但在这些令牌失败之后,这是我的本地服务器日志的一部分,其中发生了造成:

Processing #234: 153668daa0685d2cb988b6f4a1b5cc0d83ee52772.....<br>Message successfully delivered <br>
Processing #235: 9d9bbce1335de97fe06c4e82000008fad1b88337e.....<br>Message successfully delivered <br>
Processing #236: 74dc41e4e57fe492bdfbfdcda51ae73b217e3a72f.....<br>Message successfully delivered <br>
Processing #237: c8181554e6dc690d8e4a9ce32d1ea9d820d27045d.....<br>Message successfully delivered <br>
Processing #238: 86d86c9415f349647e1d428800dc3a78058775a16.....<br>Message successfully delivered <br>
Processing #239: a31437aa6a8a93ecf3443f2bdb8fa10e6f8c76b59.....<br>Message not delivered <br>
Processing #240: 99df796bc1c604db8adb9b43cb026d3afc97d6d99.....<br>Message not delivered <br>
Processing #241: 109cc26a1562962ec2f0817b9a87855cde3040462.....<br>Message not delivered <br>
Processing #242: 72dc77573e60cd689f05cb4c4b986f6ba8e1747a1.....<br>Message not delivered <br>
Processing #243: ecefedf21b5d08a922e7fec2798f8d08db89a9b43.....<br>Message not delivered <br>
Processing #244: d1d123bf2a3af135c18353a8ec80648b3d74e6231.....<br>Message not delivered <br>

我可以验证消息开始失败的设备令牌#239是有效令牌,因为我发送了一条消息并且消息已成功传递。

在我的远程服务器中,我得到一个更详细的错误日志:

Warning: fwrite(): SSL: Broken pipe in 
/myUsernameOnserver/public_html/path/to/file/push.php
on line 51 
Processing #32: d4fbb00733b13d41a2b6bba9f5c5eda14b21babd0.....
Message not delivered

Warning:  fwrite(): SSL operation failed with code 1. OpenSSL Error 
messages:
error:1409F07F:SSL routines:SSL3_WRITE_PENDING:bad write retry in 
/myUsernameOnserver/public_html/path/to/file/push.php
on line 51
Processing #33: d77c5cb283646ed5f480....
Message not delivered <br>

我发送通知的循环代码:

.....above:The connection and preparing of payload
// Encode the payload as JSON
$payload = json_encode($body);

$i = 0;
//Send the Push to each token the close connection
foreach ($deviceTokens as $deviceToken) {
    // 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));

    echo 'Processing #'.$i.': '.$deviceToken.'<br>';
    $i++;
    if (!$result) {
        echo 'Message not delivered <br>' . PHP_EOL;
            //usleep(400000); //400 msec
        }
    else {
        echo 'Message successfully delivered <br>' . PHP_EOL;
        }
}


// Close the connection to the server
fclose($fp);

....End of function

非常感谢任何帮助。

根据@Nick回答的正确代码

//Move the connection to a separated function
//to reconnect again easily in case of failing
$fp = connectToAPNS($directory, $passphrase);

$i = 0; //Logging counter

//Send the Push to each token the close connection
foreach ($deviceTokens as $deviceToken) {
        // Build the binary notification
        $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;

        for ($k = 0 ; $k < 2 ;$k++) { //Number of tries in case of connection interruption
            // Send it to the server
            $result = fwrite($fp, $msg, strlen($msg));

            echo 'Processing #'.$i.': '.$deviceToken.'<br>';
            $i++;
            if (!$result) {
                echo 'Message not delivered at k='.$k.'<br>' . PHP_EOL;
                fclose($fp);
                $fp = connectToAPNS($directory, $passphrase);
            }
            else {
                echo 'Message successfully delivered at k='.$k.'<br>' . PHP_EOL;
                break; //Stop trying 
            }
        }

    }


    // Close the connection to the server
    fclose($fp);

我的日志现在是:

Processing #284: 750e27148b65651f09bccf6617f93c7e8...<br>Message successfully delivered at k=0<br>
Processing #285: 2cdc924bdf8bc786bcc17877a324c79f1...<br>Message successfully delivered at k=0<br>
Processing #286: 48c298ffb890cd2f39e97b4214cb3d42f...<br>Message not delivered at k=0<br>
Connected to APNS <br>
Processing #287: 48c298ffb890cd2f39e97b4214cb3d42f...<br>Message successfully delivered at k=1<br>
Processing #288: 0768350f28f9b7adf64bb97265803838c...<br>Message successfully delivered at k=0<br>
Processing #289: d104e5e51062c568839cc37b4525a024c...<br>Message successfully delivered at k=0<br>

1 个答案:

答案 0 :(得分:2)

出于多种原因,可以切断与APNS服务器的连接。如果由于上述任何原因导致写入失败,则必须重新打开连接。您可以尝试再次将消息发送到同一令牌,但请记住,如果它确实是无效令牌,则连接将继续中断。

在循环中,当写入失败时,您将转到下一个令牌,而无需重新打开与APNS的连接;这不行。失败时添加一些代码以重新打开连接。您甚至可以添加一些代码来确定写入失败的原因,以确定您是否应该重试当前令牌。您也可以阅读我的答案here以获取一些提示。