2016-10-04 99 views
1

我試圖將通知推送至APNS以更新Apple Wallet應用程序中的通行證。根據this document,我們只需要將傳遞類型標識符和推送令牌發送給APN。然後他們會照顧其餘的。無法將通知推送至APNS以更新Apple Wallet中的通行證

$apnsHost = 'gateway.push.apple.com'; 
    $apnsPort = 2195; 
    $apnsCert = base_path('app/config/passbook/certificates.pem'); 
    $payload = ['aps' => []]; 
    $payload = json_encode($payload); 

    $streamContext = stream_context_create(); 
    stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert); 
    stream_context_set_option($streamContext, 'ssl', 'passphrase', 'xxxxxx'); 

    $apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext); 

    if(!$apns) { 
     Logger::logError(1, "Passbook push notification error", ['serial_number' => $serialNumber, 'pass_type_id' => $passIdentify]); 
     return "Failed to connect (stream_socket_client): $error $errorString"; 
    } else { 
     foreach($push_tokens as $idx => $push_token) { 
      $msg = chr(0) . pack('n', 32) . pack('H*', $push_token) . pack('n', strlen($payload)) . $payload; 

      fwrite($apns, $msg); 
     } 
    } 
    @socket_close($apns); 
    fclose($apns); 

沒有錯誤返回,但它似乎不起作用。我做錯了什麼?請幫忙。

+1

你肯定沒有返回錯誤?正如我所看到的,你只是寫信給socket而不是閱讀。您正嘗試將通知發送給正在生產的應用程序。您是否設法在使用沙箱網關進行開發時嚮應用發送通知?另外,可能有一些類似的問題可以幫助你。 http://stackoverflow.com/questions/26865331/stream-socket-client-unable-to-connect-to-ssl-gateway-sandbox-push-apple-co – astrocrack

+0

對不起,我沒有解釋清楚。我正在嘗試將通知推送給APNS以更新Apple Wallet應用程序中的通行證。根據[本文檔](https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/PassKit_PG/Updating.html#//apple_ref/doc/uid/TP40012195-CH5-SW1),我們只需要將通行證類型標識符和推送令牌發送給APN。然後他們會照顧其餘的。 –

+0

你使用什麼證書? – PassKit

回答

0

這是我的項目使用的代碼

$errors = []; 
    $apnsHost = 'gateway.push.apple.com'; 
    $apnsPort = 2195; 
    $apnsCert = base_path('app/config/passbook/certificates.pem'); 
    $payload = ['aps' => []]; 
    $payload = json_encode($payload); 

    $streamContext = stream_context_create(); 
    stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert); 
    stream_context_set_option($streamContext, 'ssl', 'passphrase', 'xxxxxxxxx'); 

    $apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext); 
    stream_set_blocking ($apns, 0); 

    if(! $apns) { 
     return "Failed to connect (stream_socket_client): $error $errorString"; 
    } else { 
     foreach($push_tokens as $idx => $push_token) { 
      $msg = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $push_token)) . chr(0) . chr(mb_strlen($payload)) . $payload; 

      $success = fwrite($apns, $msg); 
      if ($success === strlen($msg)) { // log success 
       Logger::logPassbook('Push success', ['push_token' => $push_token]); 
      } else { 
       Logger::logPassbook('Push failed', ['push_token' => $push_token]); 
      } 
     } 
    } 

    @socket_close($apns); 
    fclose($apns); 

    return $errors;