Iphone推送通知设备令牌错误

时间:2012-02-07 03:00:33

标签: php iphone notifications push

最后,我发现了与生产令牌混合的沙盒令牌,我更新了代码,从苹果收到错误响应,当将沙箱令牌发布到苹果时,下一个令牌都失败了。 ...虽然push msg是“$ payload ['aps'] = array('content-available'=> 1);”,apple会推送msg,但是当我找到时,设备不会显示此消息错误的,我删除它,然后重新测试。

苹果推送通知服务有一个有趣的问题: 当我为我的设备生成帖子通知并发送到苹果的服务器时,我的设备会收到通知。 但是,如果我首先通过错误的devicetoken发布通知,然后向我的设备发布正确的通知,我的设备将是无响应的,就像推送通知被苹果吃掉一样?

这有什么问题?

我使用php代码进行推送服务,这是最重要的部分:

$payload['aps'] = array('content-available' => 1);
while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
        foreach ($line as $deviceToken) {
            break;
        }

        print_r($deviceToken);
        $apnsMessage = chr(1) . $time . $time . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceToken)) . chr(0) . chr(strlen($payload)) . $payload;
        $ret = fwrite($apns, $apnsMessage);
        if ($ret !== strlen($apnsMessage)) {
            echo "push error";
        }

        ob_flush();
        flush();

        $read = array($apns);
        $null = null;
        $changedStreams = stream_select($read, $null, $null, 0, 100000);//wait for 0.1s

        if ($changedStreams === false) {    
            echo "Error: Unabled to wait for a stream availability";
        } elseif ($changedStreams > 0) {
            print "can't receive any notification behind this token";

            $responseBinary = fread($apns, 6);
            if ($responseBinary !== false || strlen($responseBinary) == 6) {

                $response = unpack('Ccommand/Cstatus_code/Nidentifier', $responseBinary);
                print_r($response);
            }
        } else {
            //update the success push status in database
        }

        print "<br>";
    }

我不知道这有什么问题,而且我还在另一个php中添加了反馈服务,并且没有从apple获取错误令牌,因为我的数据库中有很多devicetoken,我找不到哪一个是错误的。< / p>

有人帮助我,原谅我可怜的英语

1 个答案:

答案 0 :(得分:0)

假设您的$apns以这种方式实施

$apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 2,STREAM_CLIENT_CONNECT, $streamContext);

你应该检查$ errorString以找出错误。

或尝试关闭每封邮件的套接字,看看是否有任何差异

fwrite($apns, $apnsMessage);
socket_close($apns);
fclose($apns);