傻瓜的 APNS 反馈和 PHP

Posted

技术标签:

【中文标题】傻瓜的 APNS 反馈和 PHP【英文标题】:APNS Feedback and PHP for a dummie 【发布时间】:2014-01-17 10:41:04 【问题描述】:

我的上一个应用程序获得了很多用户(> 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?

【问题讨论】:

您是在 AdHoc 模式还是开发者模式下尝试这个? Check this,它说它只适用于 AdHoc/Live 模式 我处于生产模式,谢谢。 【参考方案1】:

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

试试这些代码

    $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);

【讨论】:

谢谢你,但它没有给我反馈,你的代码简单地推送一个用户,即使它无效(用户删除应用程序),apns 也会写入令牌,但如果一个无效它不会处理下一个令牌。但非常感谢。

以上是关于傻瓜的 APNS 反馈和 PHP的主要内容,如果未能解决你的问题,请参考以下文章

查询 APNs 反馈服务器的 PHP 技术

APNS 奇怪的反馈

如何使用 java 编写 APNS 反馈服务?

来自 APNS(Apple 推送通知服务器)的反馈服务

通知 APNS 反馈服务有关停用通知的设备?

Apple 推送通知服务 (APNS):反馈服务响应缺少字节?