2017-02-25 7 views
1

안녕하세요, 명령 행에서 작동하는 푸시 알림을 보내고 있지만 PHP 웹 페이지로 실행하지 않는 것은 아닙니다.iOS 용 PHP 푸시 알림은 Apache에서 작동하지 않지만 명령 행에서 작동합니다.

경로는 올바른 apn 및 passphrase입니다 (정확히 동일한 코드).

페이지를 실행하지만 아파치가 호출 할 때 실패합니다.

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 echo PushNotifications :: iOS ($ msg_payload, $ deviceToken, $ sandbox); –

답변

0

좌절을 많이 한

나는 이러한 오류/경고를 얻을. 나는 pem 파일을 코드와 같은 경로에 넣기를 원하지 않았지만, 그것이 작동하는 유일한 방법이었다!

다른 경로에 넣으면 명령 줄이 작동하지만 아파치는 코드와 동일한 폴더에있는 경우 모두 작동합니다.

다른 사람들에게 도움이되기를 바랍니다.

올바른 방향으로 나를 가리켜 주신 Fahad Jamal에게 감사드립니다.