2013-04-11 124 views
4

現在,我可以從已安裝通過設備的設備發送推送令牌,但我不知道此時反饋如何工作。從Apple文檔中,Apple推送通知服務(APN)向服務器提供反饋,以確定pushToken是否有效。如何獲得此反饋?我嘗試這個代碼,但很多錯誤。這是代碼:
發送推送通知時如何從APN獲得反饋

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

這應該有效。您無需在每次推送請求時都執行此操作。根據您更新的頻率和設備數量,您可以設置每天或每週的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 2016-03-30 16:12:46

+2

是的,這是正確的。 – PassKit 2016-03-30 23:40:12

+0

謝謝你的朋友! – user1576208 2016-03-31 05:02:18