5

プッシュ通知を送信しようとすると、「接続が拒否されました」というエラーが表示されますが、理由はわかりません...同じディレクトリとルートディレクトリに apns-dev.pem をアップロードしましたが、どちらも機能しません。

<?php
$payload['aps'] = array('alert' => 'This is the alert text', 'badge' => 1, 'sound' => 'default');
$payload = json_encode($payload);
$apnsHost = 'gateway.sandbox.push.apple.com';
$apnsPort = 2195;
$apnsCert = 'apns-dev.pem';
$apnsPass = 'secret';

$streamContext = stream_context_create();
stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);
stream_context_set_option($streamContext, 'ssl', 'passphrase', $apnsPass);

$apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 60, STREAM_CLIENT_CONNECT, $streamContext);

if (!$apns) {
    echo "Error: $errorString ($error)";
}

// Do this for each
$deviceToken = '00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000';
$apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceToken)) . chr(0) . chr(strlen($payload)) . $payload;
fwrite($apns, $apnsMessage);
// End do

socket_close($apns);
fclose($apns);
?>

私が間違っていることを誰かが知っていますか?パスフレーズを削除して送信しないと機能しません...

4

3 に答える 3

7

発信ポート 2195 が開いていることを確認してください。これはファイアウォールの設定にあります。

于 2012-06-07T06:53:37.667 に答える
2

.pem ファイルで必要な場合を除き、パスフレーズは必要ありません。接続には、ピア検証 (オプション verify_peer) をオンにする必要があります。また、$apnsCert が証明書への有効なパスであることを確認してください。サニティ チェックとして絶対パスを使用できます。

最後に、接続に影響はありませんが、デバイス トークンが有効である必要があります。

于 2009-10-08T17:54:19.103 に答える
0

これを追加して、そのエラーを修正したことを知っています: STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT

エラーが発生していないことはわかっていますが、通知は受け取りません。Dev-tokenは有効ではないと思うので、これはどのように見えるかです

数字 数字 数字 数字 数字 数字 数字

次の行でスペースが削除されます: $apnsMessage = chr(0) 。chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceToken)) . chr(0) . chr(strlen($ペイロード)) . $ペイロード;

編集:私は問題を発見しました: 私のサーバーは発信ポートを拒否しています。メールを送信したところ、彼らがそれをアクティブにできることを望んでいます...

于 2009-10-09T16:32:06.150 に答える