发送推送通知时,如何得到的APN反馈(How get feedback from APNs when

2019-08-21 16:44发布

现在我可以从安装了一通已经在设备上发送推送令牌,但我不知道如何在这一点上,反馈工作。 从苹果的文档,苹果推送通知服务(APN的)反馈给服务器,以判断是否pushToken是否有效。 如何得到这种反馈? 我试试这个代码,但很多错误。 这是代码:

<?php
$cert = '/Applications/MAMP/htdocs/passesWebserver/certificates.pem';
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', $cert);
stream_context_set_option($ctx, 'ssl', 'verify_peer', false);

$fp = stream_socket_client('ssl://feedback.sandbox.push.apple.com:2196', $error,            $errorString, 60, STREAM_CLIENT_CONNECT, $ctx);
// production server is ssl://feedback.push.apple.com:2196

if (!$fp) {
error_log("Failed to connect feedback server: $err $errstr",0);
return;
}
else {
   error_log("Connection to feedback server OK",0);
}
    error_log("APNS feedback results",0);
    while ($devcon = fread($fp, 38))
    {
   $arr = unpack("H*", $devcon); 
   $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);
   error_log ("TIMESTAMP:" . $feedbackDate, 0);
      error_log ( "DEVICE ID:" . $feedbackDeviceToken,0);
    }
fclose($fp);
?>

Answer 1:

这应该工作。 你并不需要每推送请求运行此。 根据如何频繁更新和设备的数量,你可以设置每天或每周cron作业。

$cert_file = '/path/to/combined/cert.pem';
$cert_pw = 'top secret';

$stream_context = stream_context_create();
stream_context_set_option($stream_context, 'ssl', 'local_cert', $cert_file);
if (strlen($cert_pw))
    stream_context_set_option($stream_context, 'ssl', 'passphrase', $cert_pw);

$apns_connection = stream_socket_client('feedback.push.apple.com:2196', $error_code, $error_message, 60, STREAM_CLIENT_CONNECT, $stream_context);

if($apns_connection === false) {
    apns_close_connection($apns_connection);

    error_log ("APNS Feedback Request Error: $error_code - $error_message", 0);
}

$feedback_tokens = array();

while(!feof($apns_connection)) {
    $data = fread($apns_connection, 38);
    if(strlen($data)) {
        $feedback_tokens[] = unpack("N1timestamp/n1length/H*devtoken", $data);
    }
}
fclose($apns_connection);


if (count($feedback_tokens))
    foreach ($feedback_tokens as $k => $token) {
         // code to delete record from database
    }


文章来源: How get feedback from APNs when sending push notification