推送通知,php错误和警告

时间:2014-07-22 03:14:28

标签: ios xcode ssl push-notification apple-push-notifications

我知道有很多问题但是我尝试了所有的建议而没有运气,我在shell命令中运行push.php时出现以下错误。我正在关注this tutorial并且一切正常直到php。我重复了很多次证书和密钥,因为它让我使用openssh连接然后我想问题不在于它。今天我再次重新创建了所有证书,并且现在做了一个新项目我甚至没有收到你接受允许推送通知的第一个提示。我被困了我在截止日期并且面对这个问题一周,请帮助我,我的PHP与修改令牌和密码的教程完全相同的文件我添加了ck.pem的路径,正如一些建议SOanswers但还没有工作。另外我添加了CA文件entrust_2048_ca.cer,它没有帮助解决问题。所有这些都是使用开发证书而不是在服务器上,你的想法可能是什么问题?使用外部库会更好吗? 感谢您的帮助。

  

警告:stream_socket_client():无法设置私钥文件   `/Users/.../..../.../.../ck.pem'在   第19行/Users/dalyaseen/Documents/test3d/test3d/push.php

     

警告:stream_socket_client():无法在中创建SSL句柄   第19行的/.../..../.../.../push.php

     

警告:stream_socket_client():无法启用加密   第19行/Users/.../..../.../.../push.php

     

警告:stream_socket_client():无法连接   ssl://gateway.sandbox.push.apple.com:2195(未知错误)in   /Users /.../..../.../.../push.php第19行无法连接:0

这是php脚本

<?php
#$deviceToken='ac49c9c8 a7d7f340 1c5c9af8 b8afeada ee7cdb77 051f12e8 90c314e1 129af45e';
$deviceToken='ac49c9c8a7d7f3401c5c9af8b8afeadaee7cdb77051f12e890c314e11y8u89i9o0lp';
# Put your private key's passphrase here:
$passphrase = '1234';

# Put your alert message here:
$message = 'push msg!';

$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', '/Users/d/Documents/test/test/ck.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
stream_context_set_option($ctx, 'ssl', 'cafile', '/Users/d/Documents/test/test/entrust_2048_ca.cer');
#stream_context_set_option($ctx, 'ssl', 'allow_self_signed', 1);
#stream_context_set_option($ctx, 'ssl', 'verify_peer', 1);

 //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);

echo '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)
    echo 'Message not delivered' . PHP_EOL;
else
    echo 'Message successfully delivered' . PHP_EOL;

// Close the connection to the server
fclose($fp);

?>

1 个答案:

答案 0 :(得分:5)

试用此代码:

<?php

$deviceToken='ac49c9c8a7d7f3401c5c9af8b8afeadaee7cdb77051f12e890c314e11y8u89i9o0lp';
$passphrase = '1234';
$message = 'push msg!';
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
$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);

//echo '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)
    return 'Message not delivered' . PHP_EOL;

// Close the connection to the server
fclose($fp);
?>

IMP :将您的ck.pem文件与此代码并行。 代码工作后,您可以更改.pem文件的位置。

确保您创建的证书处于“开发人员”模式 同样,设备已添加到配置文件中。