How to get feedback from APN when sending a push notification

Now I can send push Token from a device that has already set a pass, but I do not know how the feedback works at this point. From Apple docs, Apple Push Notification Service (APNs) provides server feedback to let you know if pushToken is valid or not. How to get this feedback? I try this code, but a lot of errors. This is the code:

<?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);
?>
+5
source share
1 answer

That should work. You do not need to run this on every push request. Depending on how often you update data and the number of devices, you can set a daily or weekly cron job.

$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
    }
+8
source

All Articles