PHP技术查询APNs反馈服务器

30 php stream fread push-notification apple-push-notifications

有人可以澄清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);
?>
Run Code Online (Sandbox Code Playgroud)

到目前为止,我得到的只是一个空回复.没有错误,所以它是连接.

我不知道null回复是否意味着没有数据,或者我的方法fread()是错误的.

谢谢

Nic*_*anu 69

这是我第一次尝试连接时困扰我的一个大问题: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;
}
Run Code Online (Sandbox Code Playgroud)

如果一切正常,则此函数的返回值将类似于此(通过print_r()):

Array
(
    Array
    (
        [timestamp] => 1266604759
        [length] => 32
        [devtoken] => abc1234..............etcetc
    ),
    Array
    (
        [timestamp] => 1266604922
        [length] => 32
        [devtoken] => def56789..............etcetc
    ),
)
Run Code Online (Sandbox Code Playgroud)


小智 1

我从苹果论坛得到了解决方案,它是用于开发的。也可以尝试在生产中使用此方法。

“好吧,尽管听起来很愚蠢,但我找到了一个解决方案:

在程序门户中创建一个虚拟应用程序 ID,在其上启用开发推送通知 创建并下载关联的配置文件 创建一个新的 xcode 项目,并在启动时调用 registerForRemoteNotificationTypes 方法。在您的设备上安装虚拟应用程序。此时,您的设备上应该运行两个 DEVELOPMENT 应用程序:原始应用程序和虚拟应用程序。两者都应该注册才能接收推送通知。卸载原始应用程序,然后尝试向该应用程序发送推送通知。调用反馈服务,您应该会收到返回的数据。”