APNS反馈和PHP为dummie

时间:2014-01-17 10:41:05

标签: php ios iphone push-notification apple-push-notifications

我的上一个应用程序获得了大量用户(> 200 000),我已经设置了自己的推送解决方案。

尽管如此,我还是面临新问题,当我想要同时推动所有用户时。

打开一个ssl连接后,我使用所有令牌进行循环并使用如果令牌有效(isDigit和长度> 64)但我所理解的是其中一个令牌对我的apns .pem不再有效apns将停止循环。我知道我需要调用反馈服务来获取我的无效令牌,但我推送我的用户第一个apns将停止我的循环,我无法获得任何反馈服务!

我已经设置了一个简单的PHP脚本来获得反馈:

<?php 

$stream_context = stream_context_create();
stream_context_set_option($stream_context, 'ssl', 'local_cert', 'myApns.pem');
$apns = stream_socket_client('ssl://feedback.push.apple.com:2196',
    $errcode, $errstr, 60, STREAM_CLIENT_CONNECT, $stream_context);

if(!$apns) {
    echo "ERROR $errcode: $errstr\n";
    return;
}

$feedback_tokens = array();
//and read the data on the connection:
while(!feof($apns)) {
    $data = fread($apns, 38);
    if(strlen($data)) {
        $feedback_tokens[] = unpack("N1timestamp/n1length/H*devtoken", $data);
    }
}
fclose($apns);
print_r($feedback_tokens);
echo("done");

?>

但它始终打印出一个空数组(Array())。在PHP中有任何解决方案,所以我将我的令牌发送到验证令牌是否有效的apns?

1 个答案:

答案 0 :(得分:0)

在循环调用之前限制空值。

试试这些代码

    $passphrase = PASSWORD;
    $ctx = stream_context_create();
    stream_context_set_option($ctx, 'ssl', 'local_cert', 'MyApns.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);

    $body['aps'] = array('alert' => $msg,'sound' => 'default');
    $payload = json_encode($body);
    $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;

    $result = fwrite($fp, $msg, strlen($msg));
    if (!$result){
        return false;
        //echo 'Message not delivered' . PHP_EOL;
    }else{
        return true;
        //echo 'Message successfully delivered' . PHP_EOL;
}fclose($fp);
}