0

嗨,开发者朋友们,

我在 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 服务:打开错误与否。

我希望你能理解并帮助我。非常感谢。

4

0 回答 0