2012-04-13 5 views
0

私はapnsにプッシュメッセージを送信するためにPHPを使用します。「Enhanced notification format」を使用して送信しましたが、「エラー応答パケットのコード」を取得できません。 ?ここに私のコードはアップルについてEnhanced notification format

<?php 
header("Content-Type: text/html; charset=UTF-8"); 

$deviceToken = "123"; 

$content = "testing"; 

if(isset($content)) 

{ 

$newContent=substr($content,0,30)."..."; 

$re_content=iconv("GB2312","UTF-8",$newContent); 
$pass = 'Ladder'; 

$body = array("aps" => array("alert" => $re_content, "badge" => 1, "sound" => 'received5.caf')); 

      $ctx = stream_context_create(); 

      stream_context_set_option($ctx, 'ssl', 'local_cert', 'dev.pem'); 

      stream_context_set_option($ctx, 'ssl', 'passphrase', $pass); 

      //$fp = stream_socket_client('ssl://gateway.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx); 

      $fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx); 

      stream_set_blocking ($fp, 0); 
      if (!$fp) 
      { 
       print "Failed to connect $err $errstrn"; 
       return; 
      } 
      else 
      { 
      print "Connection OK\n<br/>"; 
      } 


      $payload = json_encode($body); 


      $msg = 
      // new: Command "1" 
      chr(1) 
      // new: Identifier "1111" 
      . chr(1) . chr(1) . chr(1) . chr(1) 
      // new: Expiry "tomorrow" 
      . pack('N', time() + 86400) 
      // old 
      . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceToken)) . chr(0) . chr(strlen($payload)) . $payload; 
      //print "sending message :" . $payload . "\n"; 
      fwrite($fp, $msg); 
      //checkAppleErrorResponse($fp); 
      echo 'Done\n'; 

      fclose($fp); 

      echo $apple_error_response = fread($fp, 6); 

      /* return false; 
      exit(); */ 
} 
?> 

答えて

5

である私が強化された形式で通知を送信するときに、それが動作

function error_response($fp) 
{ 
    $read = array($fp); 
    $null = null; 
    $changedStreams = stream_select($read, $null, $null, 0, 1000000); 

    if ($changedStreams === false) 
    { 
     echo ("Error: Unabled to wait for a stream availability"); 
    } 
    elseif ($changedStreams > 0) 
    { 
     $responseBinary = fread($fp, 6); 
     if ($responseBinary !== false || strlen($responseBinary) == 6) 
     { 
      $response = unpack('Ccommand/Cstatus_code/Nidentifier', $responseBinary); 
      var_dump($response); 
     } 
    } 
} 

fwriteの後と密接なコマンドの前に、この関数を呼び出します。しかし、単純な形式の通知では機能しません。私は理由を知りません...どんな手掛かりですか?

+1

これは拡張形式でしか動作しない理由は、エラーが単純な形式で黙って破棄されるためです。 – StapleGun