2014-01-24 70 views
1

我有一個腳本,它嚮應用程序執行Apple推送通知。腳本是:Yii阻止Apple推送通知腳本運行

$payload['aps'] = array('alert' => 'This is the alert text', 
         'badge' => 1, 'sound' => 'default', 
      'article_id'=> '110' 
      ); 
$payload = json_encode($payload); 


$apnsHost = 'gateway.sandbox.push.apple.com'; 
$apnsPort = 2195; 
$apnsCert = '/var/www/schoolspace/apple_server/mountmercy/MountMercy-dev.pem'; 

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

$deviceToken = "xxxxxxxxxxxxxxxxxxxxxxxxx"; 

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


$apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceToken)) . chr(0) . chr(strlen($payload)) . $payload; 

fwrite($apns, $apnsMessage); 

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

我已經創建了所需的.pem。當我作爲一個獨立的腳本運行:

php index.php 

一切正常,應用程序收到通知。有一個警告然而:

Warning: socket_close(): supplied resource is not a valid Socket resource 

但它仍然有效。然而,當我運行這個Yii中,我得到的錯誤:

stream_socket_client() [<a href='function.stream-socket-client'>function.stream-socket-client</a>]: Unable to set private key file `/var/www/schoolspace/apple_server/mountmercy/MountMercy-dev.pem' 

我甚至得到這個錯誤設置YII_DEBUG爲false時。我在afterSave()中的Yii「Message」模型中運行這段代碼。它與獨立腳本完全相同。但不知何故,Yii阻止了它的運行。有任何想法嗎?

回答

0

既然你收到這意味着你pem文件可能是好的通知,但 你的代碼並不顯示你在哪裏提供passphrase。你可以嘗試下面的代碼爲我工作。

  $badge = 1; 
      $sound = 'default'; 
      $development = false;//change it to true if in development 
      $passphrase='passphrase';//pass phrase of the pem file 

      $payload = array(); 
      $payload['aps'] = array('alert' => $msg_text, 'badge' => intval($badge), 'sound' => $sound); 
      $payload = json_encode($payload); 

      $apns_url = NULL; 
      $apns_cert = NULL; 
      $apns_port = 2195; 

      if($development) 
      { 
       $apns_url = 'gateway.sandbox.push.apple.com'; 
       $apns_cert = dirname(Yii::app()->request->scriptFile).'/file.pem'; 
      } 
      else 
      { 
       $apns_url = 'gateway.push.apple.com'; 
       $apns_cert = dirname(Yii::app()->request->scriptFile).'/file.pem'; 
      } 
      $stream_context = stream_context_create(); 
      stream_context_set_option($stream_context, 'ssl', 'local_cert', $apns_cert); 
      stream_context_set_option($stream_context, 'ssl', 'passphrase', $passphrase); 

      $apns = stream_socket_client('ssl://' . $apns_url . ':' . $apns_port, $error, $error_string, 2, STREAM_CLIENT_CONNECT, $stream_context);    
      $device_tokens2= "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; 

      $apns_message = chr(0) . chr(0) . chr(32) . pack('H*', $device_tokens2) . chr(0) . chr(strlen($payload)) . $payload; 
      $msg=fwrite($apns, $apns_message); 
      @socket_close($apns); 
      @fclose($apns);