嗨,开发者朋友们,
我在 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 服务:打开错误与否。
我希望你能理解并帮助我。非常感谢。