无法使用 php 向 ios 发送推送通知
Unable to send push notification to ios using php
我正在尝试使用 php 和 Yii 框架向 IOS 发送推送通知。我创建了一个函数来获取数据和发送通知。 $data 是一个数组,其中包含一条消息和一个数组,用于保存注册 ID(设备令牌)。我 运行 它在我的本地主机上,但通知没有发送到我的设备。顺便说一句,我的函数输出是一个整数值,我无法识别消息是否已发送或什么!?
我的代码有什么问题吗?
private function _pushIOS($data)
{
// Create a connection
$apnsHost = $this->_notificationUrl;
$apnsPort = 2195;
$apnsCert = Yii::app()->controller->createUrl('/').'/my_certificate_dev.pem';
$streamContext = stream_context_create();
stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);
$apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext);
if (!$apns)
exit("Failed to connect: $error $errorString" . PHP_EOL);
foreach($data['registration_ids'] as $deviceToken) {
$body = array();
$body['aps'] = array(
'alert' => $data['data']['message'],
'badge' => 1,
'sound' => 'default'
);
// Encode the payload as JSON
$payload = json_encode($body);
// Build the binary notification
$apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceToken)) . chr(0) . chr(strlen($payload)) . $payload;
// Send it to the server
$result = fwrite($apns, $apnsMessage, strlen($apnsMessage));
}
// Close the socket and connection to the server
@socket_close($apns);
fclose($apns);
return json_decode($result);
}
终于,我得到了答案。问题出在 pem 文件路径上。绝对路径必须传递给函数才能工作。应替换以下行:
$apnsCert = Yii::app()->controller->createUrl('/').'/my_certificate_dev.pem';
正确路径:
$apnsCert = dirname(Yii::app()->request->scriptFile).'/my_certificate_dev.pem';
我正在尝试使用 php 和 Yii 框架向 IOS 发送推送通知。我创建了一个函数来获取数据和发送通知。 $data 是一个数组,其中包含一条消息和一个数组,用于保存注册 ID(设备令牌)。我 运行 它在我的本地主机上,但通知没有发送到我的设备。顺便说一句,我的函数输出是一个整数值,我无法识别消息是否已发送或什么!?
我的代码有什么问题吗?
private function _pushIOS($data)
{
// Create a connection
$apnsHost = $this->_notificationUrl;
$apnsPort = 2195;
$apnsCert = Yii::app()->controller->createUrl('/').'/my_certificate_dev.pem';
$streamContext = stream_context_create();
stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);
$apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext);
if (!$apns)
exit("Failed to connect: $error $errorString" . PHP_EOL);
foreach($data['registration_ids'] as $deviceToken) {
$body = array();
$body['aps'] = array(
'alert' => $data['data']['message'],
'badge' => 1,
'sound' => 'default'
);
// Encode the payload as JSON
$payload = json_encode($body);
// Build the binary notification
$apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceToken)) . chr(0) . chr(strlen($payload)) . $payload;
// Send it to the server
$result = fwrite($apns, $apnsMessage, strlen($apnsMessage));
}
// Close the socket and connection to the server
@socket_close($apns);
fclose($apns);
return json_decode($result);
}
终于,我得到了答案。问题出在 pem 文件路径上。绝对路径必须传递给函数才能工作。应替换以下行:
$apnsCert = Yii::app()->controller->createUrl('/').'/my_certificate_dev.pem';
正确路径:
$apnsCert = dirname(Yii::app()->request->scriptFile).'/my_certificate_dev.pem';