Yii阻止Apple推送通知脚本运行

时间:2014-01-24 21:10:35

标签: yii push-notification apple-push-notifications

我有一个脚本可以向应用程序发送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()中的myii“Message”模型中运行了这段代码。它与独立脚本完全相同。但不知何故,Yii阻止它运行。有什么想法吗?

1 个答案:

答案 0 :(得分: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);