嗨朋友开发者,
我在Symfony2中开发了一个Web应用程序,它包含一个API,用于与iOS上的某个移动应用程序进行交互。为简单起见,我的Web应用程序通过移动应用程序上的APNS服务Apple发送每日推送通知。 为此,我使用以下函数:
<?php
function sendNotification($message, $numBadge, $deviceTokenList)
{
$body = array();
$body['aps'] = array();
$body['aps']['alert'] = $message;
$body['aps']['badge'] = $numBadge;
$body['aps']['sound'] = "default";
$payload = json_encode($body);
// Device token
$deviceToken = "";
// Create SSL context
$ctx = stream_context_create();
// Opening PEM file
$pathCk = $this->kernel->locateResource('@MyBundle/Notifications/ck.pem');
stream_context_set_option($ctx, 'ssl', 'local_cert', $pathCk);
// Opening connection with apple servers
$fp = stream_socket_client('ssl://gateway.push.apple.com:2195',
$err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
if(!$fp) {
print "Connection error: $err $errstr\n";
}
else {
print "Connection OK\n";
}
// For each device registered
foreach($deviceTokenList as $deviceToken)
{
// Construction des données à envoyer
$msg = chr(0) . pack('n', 32)
. pack('H*', str_replace(' ', '', $deviceToken))
. pack('n', strlen($payload)) . $payload;
print "Message: " . $payload . "\n";
// Sending data
$result = fwrite($fp, $msg, strlen($msg));
if (!$result){
echo '<p>The message has not been sent '. PHP_EOL;
}
else{
echo '<p>The message has been sent ' . PHP_EOL;
}
}
// Close connection
fclose($fp);
}
?>
此功能在没有Symfony2的情况下工作,因为在此框架下迁移之前,通知系统已集成到另一个Web应用程序中。 为了使它在Symfony2中工作,我添加了一行:
<?php
$pathCk = $this->kernel->locateResource('@MonBundle/Notifications/ck.pem');
?>
并替换此行:
<?php
stream_context_set_option($ctx, 'ssl', 'local_cert', './ck.pem');
?>
通过以下内容:
<?php
stream_context_set_option($ctx, 'ssl', 'local_cert', $pathCk);
?>
所以,问题在于打开并将证书ck.pem传输到Apple Service:要么是错误打开还是不打开。
我希望你明白,你可以帮助我。 非常感谢。