我有一个脚本,该脚本会在应用程序上发布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"消息"模型中运行这一段的代码。它与独立脚本完全相同。但是YII以某种方式阻止了它运行。有什么想法吗?
由于您收到的通知,这意味着您的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);