这是一个大困扰,当我第一次尝试连接时困惑我: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
),
)