PHP技术来查询的APN反馈服务器(PHP technique to query the APNs

2019-06-18 11:27发布

有人能澄清什么的APN(Apple推送通知)希望尽可能您如何查询呢?

该文件说它开始只要建立连接发送。 这是否意味着我不这样做的fread()就可以了?

这里是我当前的代码,试图读取它。 我没有把fread()在一个循环中,因为我不知道什么指示响应“没有更多的记录为:”我不希望我的服务器上的无限循环。

<?php
$apnsCert = 'HOHRO-prod.pem';

$streamContext = stream_context_create();
stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);
stream_context_set_option($streamContext, 'ssl', 'verify_peer', false);

$apns = stream_socket_client('ssl://feedback.push.apple.com:2196', $error, $errorString, 60, STREAM_CLIENT_CONNECT, $streamContext);

echo 'error=' . $error;
echo 'errorString=' . $errorString;


$result = fread($apns, 38);
echo 'result=' . $result;


fclose($apns);
?>

到目前为止,所有我得到的是一个空的答复。 有没有错误,因此它被连接。

如果无效答复表示没有数据是存在的,还是我的,我不知道fread()是错误的方式做到这一点。

谢谢

Answer 1:

下面是这让我感到困惑,当我第一次尝试连接一个很大的疑难杂症:在APNS反馈服务器只返回设备令牌自上次反馈请求已“过期”。 这意味着大多数的你会得到一个NULL响应,除非你已经有大量的应用程序的用户的处理时间。

所以因为后您的反馈查询他们走了好确保你已过期的设备标记存储到磁盘或数据库。 这使得测试痛苦,至少可以说!

下面是一个完整的功能,以获取来自APNS反馈服务器设备令牌(非常感谢的答案上面帮我把它放在一起):

function send_feedback_request() {
    //connect to the APNS feedback servers
    //make sure you're using the right dev/production server & cert combo!
    $stream_context = stream_context_create();
    stream_context_set_option($stream_context, 'ssl', 'local_cert', '/path/to/my/cert.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);
    return $feedback_tokens;
}

如果一切顺利,这个函数的返回值会是这个样子(通过的print_r()):

Array
(
    Array
    (
        [timestamp] => 1266604759
        [length] => 32
        [devtoken] => abc1234..............etcetc
    ),
    Array
    (
        [timestamp] => 1266604922
        [length] => 32
        [devtoken] => def56789..............etcetc
    ),
)


Answer 2:

但是你需要循环,为了阅读所有的设备代码检查流的末尾的代码看起来正确。

 while (!feof($apns)) {
        $devcon = fread($apns, 38);
 }

但是我的问题是数据的实际拆包。 有谁知道如何打开您刚才阅读与时间戳等相处实际的设备ID(如字符串)的二进制数据?



Answer 3:

我从苹果论坛解决方案,它是发展。 试试这个生产也。

“好了,哑巴因为它的声音,我发现了一个解决方案:

创建程序门户网站的虚拟应用程序ID,使发展推送通知就可以创建并下载相关的供应配置文件创建一个新的Xcode项目,并调用开始registerForRemoteNotificationTypes方法。 您的设备上安装的虚拟应用程序。 此时,你应该有你的设备上运行两个开发的应用程序:原有的应用程序和虚拟应用程序。 双方应注册为接收推送通知。 卸载原来的应用程序,并尝试推送通知发送到该应用程序。 调用反馈服务,你应该得到的数据备份“。



Answer 4:

这终于为我工作。

$arr = unpack("H*", $devconts); 
$rawhex = trim(implode("", $arr));

$feedbackTime = hexdec(substr($rawhex, 0, 8)); 
$feedbackDate = date('Y-m-d H:i', $feedbackTime); 
$feedbackLen = hexdec(substr($rawhex, 8, 4)); 
$feedbackDeviceToken = substr($rawhex, 12, 64);

然后你只需检查针对时间戳的设备令牌!



Answer 5:

Just started using this library - works great for me!

https://github.com/mac-cain13/notificato



文章来源: PHP technique to query the APNs Feedback Server