2013-04-11 8 views
4

Теперь я могу отправить push-токен с устройства, которое уже установило пропуск, но я не знаю, как работает обратная связь в этом пункте. Из документов Apple служба Apple Push Notification (APNs) обеспечивает обратную связь с сервером, чтобы сообщить, действителен ли pushToken или нет. Как получить эту обратную связь? Я пробую этот код, но много ошибок. Это код:
Как получить обратную связь от APN при отправке push-уведомления

<?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); 
?> 

ответ

7

Это должно сработать. Вам не нужно запускать это при каждом запросе push. В зависимости от того, как часто вы обновляетесь, и количества устройств, вы можете установить ежедневное или еженедельное задание 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 
    } 
+0

Просто убедитесь, что если я хорошо понял, код, который вы написали, возвращает массив токенов, которые больше недействительны? Тогда моя работа - удалить из mysql ... – user1576208

+2

Да, это правильно. – PassKit

+0

Спасибо, друг! – user1576208