Apple Push通知未被发送

时间:2012-01-04 19:00:51

标签: php iphone apple-push-notifications

我已经使用正确的设备ID生成了.cer文件,配置文件,通过组合.cer和私钥文件生成.pem文件,并将其上传到服务器。 app id匹配。我也提供了密码,这是正确的。

我使用telnet从服务器测试了端口和连接,它连接正常。

我已经通过openssl命令测试了证书,它返回0 - 没有错误。

证书和应用程序处于开发/调试模式,iPhone设置为接收通知,接收令牌并以相同的长度正确地传送到服务器 - 64。

从服务器发送消息时,错误代码为0 - 表示没有错误。

以下是服务器的代码示例:

$options = array('ssl' => array(
  'local_cert' => 'cert.pem',
  'passphrase' => 'pass'
));

$streamContext = stream_context_create();
stream_context_set_option($streamContext, $options);
$apns = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $error, $errorString, 60, STREAM_CLIENT_CONNECT, $streamContext);

if ($apns)
{
    $payload['aps'] = array('alert' => 'push test', 'badge' => 1, 'sound' => 'default');
    $payload = json_encode($payload);

    $apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $token)) . chr(0) . chr(strlen($payload)) . $payload;
    fwrite($apns, $apnsMessage);

    fclose($apns);
} 
else 
{ 
    echo "Connection failed";
    echo $errorString."<br />";
    echo $error."<br />";
}

我还能尝试什么?

1 个答案:

答案 0 :(得分:1)

最终有效的代码如下:

    $ctx = stream_context_create();

    stream_context_set_option($ctx, 'ssl', 'local_cert', 'pushcert.pem');
    stream_context_set_option($ctx, 'ssl', 'passphrase', 'pass');

    // Create the payload body
    $body['aps'] = array(
    'alert' => array('body' => 'Message', 'action-loc-key' => 'Show'),
    'sound' => 'default'
    );

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

    // Open a connection to the APNS server
    $apns = stream_socket_client(
    'ssl://gateway.sandbox.push.apple.com:2195', $err,
    $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);

    if (!$apns)
    {
        echo "Failed to connect: $err $errstr" . PHP_EOL;   
    }

    echo 'Connected to APNS' . PHP_EOL;

    $imsg = chr(0) . pack('n', 32) . pack('H*', $message) . pack('n', strlen($payload)) . $payload;

            // Send it to the server
    $res = fwrite($apns, $imsg, strlen($imsg));

    if (!$res)
    {
        echo 'Message not delivered' . PHP_EOL;
    }
    else
    {
        echo 'Message successfully delivered' . PHP_EOL;
    }
    fclose($apns);