PHP Push Notification для iOS работает в командной строке, но не с Apache

Привет, я посылаю push-уведомление, которое прекрасно работает в командной строке, но не при запуске его как веб-страница php.

Пути правильные apn и и пароль (точно такой же код).

Я запускаю страницу, но происходит сбой при вызове 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;
}

1

Решение

После большого разочарования путь был проблемой. Я не хотел помещать файл pem в тот же путь, что и код, но это был единственный способ, которым он работал!

Командная строка работала, если я указывал другой путь, но Apache — нет, оба работали, если он находился в той же папке, что и код.

Надеюсь, что это помогает другим.

Спасибо Фахаду Джамалу за то, что он указал мне правильное направление.

0

Другие решения

Других решений пока нет …