2016-10-04 96 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;