Уведомление Apple Push не отправляется - PullRequest
1 голос
/ 04 января 2012

Я сгенерировал файл .cer, файл обеспечения с правильным идентификатором устройства, сгенерировал файл .pem, объединив файлы .cer и секретного ключа, загрузив его на сервер. Идентификатор приложения совпадает. Я также предоставил ключевую фразу, и это правильно.

Я протестировал порт и соединение с помощью telnet с сервера, он подключается нормально.

Я проверил сертификат командой openssl, и он вернул 0 - ошибок нет.

Сертификаты и приложение находятся в режиме разработки / отладки, iPhone настроен на получение уведомлений, токен получен и доставлен на сервер корректно и такой же длины - 64.

При отправке сообщения с сервера код ошибки равен 0, что означает отсутствие ошибок.

Вот пример кода с сервера:

$options = array('ssl' => array(
  'local_cert' => 'cert.pem',
  'passphrase' => 'pass'
));

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

if ($apns)
{
    $payload['aps'] = array('alert' => 'push test', 'badge' => 1, 'sound' => 'default');
    $payload = json_encode($payload);

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

    fclose($apns);
} 
else 
{ 
    echo "Connection failed";
    echo $errorString."<br />";
    echo $error."<br />";
}

Что еще я могу попробовать?

1 Ответ

1 голос
/ 06 января 2012

Код, который работал в конце, следующий:

    $ctx = stream_context_create();

    stream_context_set_option($ctx, 'ssl', 'local_cert', 'pushcert.pem');
    stream_context_set_option($ctx, 'ssl', 'passphrase', 'pass');

    // Create the payload body
    $body['aps'] = array(
    'alert' => array('body' => 'Message', 'action-loc-key' => 'Show'),
    'sound' => 'default'
    );

    // Encode the payload as JSON
    $payload = json_encode($body);

    // Open a connection to the APNS server
    $apns = stream_socket_client(
    'ssl://gateway.sandbox.push.apple.com:2195', $err,
    $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);

    if (!$apns)
    {
        echo "Failed to connect: $err $errstr" . PHP_EOL;   
    }

    echo 'Connected to APNS' . PHP_EOL;

    $imsg = chr(0) . pack('n', 32) . pack('H*', $message) . pack('n', strlen($payload)) . $payload;

            // Send it to the server
    $res = fwrite($apns, $imsg, strlen($imsg));

    if (!$res)
    {
        echo 'Message not delivered' . PHP_EOL;
    }
    else
    {
        echo 'Message successfully delivered' . PHP_EOL;
    }
    fclose($apns);
...