我应该将.pem文件放在codeigniter中以发送Apple推送通知?

时间:2013-10-16 14:27:36

标签: php ios codeigniter path apple-push-notifications

我正在使用REST_controller库在CodeIgniter中开发Web服务。它只是一个管理请求的控制器,我对每个使用的方法都有一个请求。其中一种方法我试图用它来发送苹果通知,所以我需要使用ck.pem文件(它是一个证书)。我知道问题是我没有.pem文件的好路径。

这是我正在使用的代码。我在控制器文件夹中有ck.pem文件但它不起作用。

function pushtest_get(){
        $data = array();
    // Put your device token here (without spaces):
        $deviceToken = 'be67171fb22f3ea8fa68c13a9f2ba7229caf3a487aa656b20f769fa2b1fa5b7a';
     // Put your private key's passphrase here:
        $passphrase = 'miguel';
        $message = 'Notification de prueba desde servicio web rest';
    ////////////////////////////////////////////////////////////////////////////////
        $ctx = stream_context_create();
        stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
        stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
     // Open a connection to the APNS server
        $fp = stream_socket_client(
            'ssl://gateway.sandbox.push.apple.com:2195', $err,
            $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);

        if (!$fp)
            exit("Failed to connect: $err $errstr" . PHP_EOL);

        $data['response'] = 'Connected to APNS' . PHP_EOL;

    // Create the payload body
        $body['aps'] = array(
            'alert' => $message,
            'sound' => 'default'
            );

    // Encode the payload as JSON
        $payload = json_encode($body);

    // Build the binary notification
        $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;

    // Send it to the server
        $result = fwrite($fp, $msg, strlen($msg));

        if (!$result)
           $data['response'] = 'Message not delivered' . PHP_EOL;
        else
            $data['response'] = 'Message successfully delivered' . PHP_EOL;

    // Close the connection to the server
        fclose($fp);
        $response->skills = $data;
        $this->response($response, 200);
    } 

4 个答案:

答案 0 :(得分:1)

你的问题可能已经解决了一周以上,但我想分享,因为我今天遇到了同样的问题。

对于CodeIgniter项目,您可以将ck.pem文件与应用程序/目录保持平行,然后下面的代码将按原样运行。

stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');

答案 1 :(得分:0)

您可以将它放在任何您想要的位置(只要网络服务器具有读取权限),只需使用文件的完整路径:

stream_context_set_option($ctx, 'ssl', 'local_cert', '/var/certs/ck.pem');

stream_context_set_option($ctx, 'ssl', 'local_cert', '/var/www/codeigniter/application/controllers/ck.pem');
但是,我不会将它保存在controllers文件夹中。对于那些可能从事该项目并可能使您在将来难以找到的人来说,这会让人感到困惑。

我会在某处创建一个证书目录并将其存储在那里。

答案 2 :(得分:0)

您可能应该保留在项目根目录中的certs文件夹中说:

/certs/ck.pem

然后:

stream_context_set_option($ctx, 'ssl', 'local_cert', './certs/ck.pem');

答案 3 :(得分:0)

你的pem文件在哪里都没关系。但好的做法是将它放在根目录中。

检查沙箱的正确环境,如开发端口是2195,生产是2196。

同时检查您为开发和生产生成的正确pem文件,并确保传递正确的passpharase值。

希望它可以帮助你:)