2012-04-13 6 views
0

ich php-Push-Nachricht an APNs schicken, i „Enhanced Format für die Meldung“ verwenden, um gesendet .. aber ich kann nicht die Rückkehr „Codes in Fehler-Response-Paket“ jemand kann mir helfen,? ? hier ist mein Codeüber das Apfel Verbesserte Benachrichtigung 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(); */ 
} 
?> 

Antwort

5

ich diese Funktion nach Fwrite nennen und vor dem Schließen

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

Befehle Es funktioniert, wenn ich eine Meldung im erweiterten Format zu senden. Aber nicht mit Meldung im einfachen Format arbeiten. Ich habe keine Ahnung, warum ... Jeder Hinweis?

+1

Der Grund funktioniert das nur im erweiterten Format ist, da Fehler in dem einfachen Format stillschweigend verworfen werden. – StapleGun