2017-02-25 15 views
1

こんにちは私は、プッシュ通知を送信しています。これはコマンドラインでうまく動作しますが、PHPのWebページとして実行していません。iOSのPHPプッシュ通知はコマンドラインでは動作しますが、Apacheでは動作しません

パスは正しいapnとpassphraseです(まったく同じコード)。

私はページを実行しますが、apacheによって呼び出されると失敗します。

Warning: stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure in ..pushnotifications.php on line 31 

Warning: stream_socket_client(): Failed to enable crypto in ..pushnotifications.php on line 31 

Warning: stream_socket_client(): unable to connect to ssl://gateway.sandbox.push.apple.com:2195 (Unknown error) in ..pushnotifications.php on line 31 

Failed to connect: 0 

コード:パスが問題だった

public function iOS($data, $devicetoken, $sandbox) { 
    $deviceToken = $devicetoken; 

    $ctx = stream_context_create(); 
    if($sandbox) { 
     stream_context_set_option($ctx, 'ssl', 'local_cert', __DIR__.'/apn/apns-dev-cert.pem'); 
    } else { 
     stream_context_set_option($ctx, 'ssl', 'local_cert', __DIR__.'/apn/apns-prod-cert.pem'); 
    } 
    stream_context_set_option($ctx, 'ssl', 'passphrase', self::$passphrase); 
    // Open a connection to the APNS server 
    // 'gateway.push.apple.com:2195'; //Production 
    // 'gateway.sandbox.push.apple.com:2195'; // Sandbox 
    if($sandbox) { 
     $fp = stream_socket_client(
      'ssl://gateway.sandbox.push.apple.com:2195', $err, 
      $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); 
    } else { 
     $fp = stream_socket_client(
      'ssl://gateway.push.apple.com:2195', $err, 
      $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); 
    } 

    if (!$fp) 
     exit("Failed to connect: $err $errstr" . PHP_EOL); 
    // Create the payload body 
    $body['aps'] = array(
     'alert' => array(
      'title' => $data['title'], 
      'body' => $data['body'], 
     ), 
     'sound' => $data['sound'], 
     'badge' => $data['badge'] 
    ); 
    // 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)); 

    // Close the connection to the server 
    fclose($fp); 
    if (!$result) 
     return 'Message not delivered' . PHP_EOL; 
    else 
     return 'Message successfully delivered' . PHP_EOL; 
} 
+0

31行目にコードが表示されることがありますか? –

+0

.pemファイルのパスを確認できますか? –

+0

$ sandbox = true; \t $ msg_payload =配列( \t \t 'タイトル' => 'テスト'、 \t \t '音' => 'デフォルト' 'あなたは新しい注文を受けている' => \t \tの体 ' \t \t 'badge' => 3 \t); \t \t \t $ deviceToken = '994A7663BCA0D0EC75BC6923D27741CC1D2C1E089995EF0BF632185CAAFDCA35'; \t エコーPushNotifications :: iOS($ msg_payload、$ deviceToken、$ sandbox); –

答えて

0

欲求不満の多くの後

は、私はこれらのエラー/警告を取得します。私は、pemファイルをコードと同じパスに入れたいとは思っていませんでしたが、それが働いた唯一の方法でした!

別のパスに入れてもコマンドラインは動作しましたが、Apacheはコードと同じフォルダ内にあった場合は両方が動作しました。

他人に役立つことを願っています。

Fahad Jamalさんに私を正しい方向に向けていただきありがとうございます。

関連する問題