2014-01-24 38 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);