2012-01-24 14 views
4

ローカルマシンでプッシュ通知をテストしましたが、完全に動作しています。その後、同じ証明書( ".pem"ファイル)を使ってファイルを実サーバにアップロードし、ポート2195と2196が開いていることを確認します。iosプッシュ通知がサーバーで機能していません

私がテスト:

telnet gateway.sandbox.push.apple.com 2195 

をそれは...

[email protected] ~ # telnet gateway.sandbox.push.apple.com 2195 

Trying 17.149.34.54... 

Connected to gateway.sandbox.push.apple.com. 

Escape character is '^]'. 

を働いているしかし、私は私のPHPスクリプトからテストするとき、それが返されます。

警告:stream_socket_client() [function.stream-socket-client]: ssl://gateway.sandbox.push.apple.comに接続できません:2195 (Co任意2196

:stream_socket_client()function.streamソケットクライアント]: SSLに接続できません://feedback.sandbox.push.apple.com nnection)は

警告タイムアウト提案?


これは、PHPのコードです:stream_socket_client機能で

$ctx = stream_context_create(); 

stream_context_set_option($ctx, 'ssl', 'local_cert', 
    "path/to/certificate"); 

$fp = stream_socket_client("ssl://gateway.push.apple.com:2195", 
    $error, $errorString, 100, 
    (STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT), $ctx); 
+0

PHPコード全体を表示してください... – powtac

+0

$ ctx = stream_context_create(); \t \t stream_context_set_option($ ctx、 'ssl'、 'local_cert'、 "path/to/certificate"); \t $ fp = stream_socket_client( "path/to/certificate"、$ error、$ errorString、100、(STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT)、$ ctx); – yasserislam

+0

これをあなたの質問に加えて、それを編集する方がいいです。 –

答えて

0

は、証明書のパスが、APNS URLを渡すべきではありません。

は、このメソッドは、接続をオープンし、それを返します:

public function connect(){ 

     $streamContext = stream_context_create(); 
     stream_context_set_option($streamContext, 'ssl', 'local_cert', '/your/cert/path'); 
     $apns = stream_socket_client('use.apns.url.here', $error, $errorString, 9, STREAM_CLIENT_CONNECT, $streamContext); 

     if (!$apns){ 
      $this->logger->error("Failed to connect to APNS: {$error} {$errorString}."); 
     } 

     return $apns; 
    } 

あなたのAPNsメッセージを構築したら、あなたはあなたの目標場合は、このチュートリアルhttp://goo.gl/9Q0uに従うことができ、次の

fwrite($apns, $apnsMessage); 

を使用してそれをプッシュすることができます独自のプッシュ通知APIを実装することです。

ありも存在しているPHPライブラリ:

、非常に良いJavaライブラリは、(私は現在、大規模なプッシュのためにそれを使用する):

+0

ありがとうございます。私はコードを編集しました。結果は同じです – yasserislam

+0

STREAM_CLIENT_PERSISTENTなしで試すことができます – pgratton

+0

同じ結果... – yasserislam

2

「接続できません...(接続がタイムアウトしました)」という同じ問題がありました。私は自宅のマシンから接続することができますが、私はホスティングサーバーからは接続できません。

私の場合、ポート2195と2196は単にホストされたサーバーから開かれていませんでした。これらのポートを開くには技術サポートに連絡しなければなりませんでした。 Pingは異なるポート番号を使用するため動作します。したがって、ホスティングサービス会社に連絡して、これらのポートが開いていることを確認してください。

幸運、

5

カズこのコードは正常に動作します:

$device = 'sdfsdfsfsdffsd'; 
$payload['aps'] = array('alert' => 'Hello I am testing the server code ....', 'badge' => 1, 'sound' => 'default'); 
$payload = json_encode($payload); 

$options = array('ssl' => array(
    'local_cert' =>'ck.pem', 
    'passphrase' => 'abc123' 
)); 



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

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

のみPEMファイルのパスをチェックし、ポートがオンになっています。

0

すべての17.0.0.0/8ブロック(すべてがAppleに属します)を許可するようにファイアウォールを設定する必要があります。 THIS ANSWER

をチェックして、Appleに従って:

のAPNサーバーでは、負荷分散を使用するので、あなたのデバイスは常に通知の同じパブリックIPアドレスに接続できません。 Appleに割り当てられている17.0.0.0/8アドレスブロック全体で、これらのポートへのアクセスを許可するのが最善です。

あなたはCSFのファイアウォール(私のような)を使用している場合、私は、ファイルをcsf.allowするために、この行を追加することをお勧めしたい:

tcp|out|d=2195|d=17.0.0.0/8

だけで、これを使用する代わりに、「17.0.0.0/ 8 "はAppleへのアウトボンド接続だけを許可し、特にポート2195への接続を許可します。NSAはそれを好まないでしょうが、これははるかに正確で安全です! ;)

関連する問題