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 应用程序:原始应用程序和虚拟应用程序。两者都应该注册才能接收推送通知。卸载原始应用程序,然后尝试向该应用程序发送推送通知。调用反馈服务,您应该会收到返回的数据。”