Push-уведомления: я почти всегда получаю сообщение «Ошибка подключения», но это сработало несколько раз - PullRequest
0 голосов
/ 19 сентября 2011

Я тестирую приложение для iPhone с push-уведомлениями.

За последние 5 дней я работал несколько раз (и обычно он работал для последовательных уведомлений в течение нескольких минут).

Вместо этого я почти всегда получаю сообщение об ошибке: «Ошибка подключения».

Поскольку он работал несколько раз, я предполагаю, что код верен, а сертификаты действительны. Так что я понятия не имею, как решить эту проблему.

Я также пытался подключиться несколько раз с помощью следующего кода:

$ctx = stream_context_create();
    stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');

    $fp = stream_socket_client('ssl://gateway.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);

    for ( $tries = 5, $interval = 10, $fp = false; !$fp && $tries > 0; $tries-- ) {
      if (!($fp)) {
        print "Failed to connect $err $errstrn"; 
        sleep ( $interval );
      }
    }

    if ($fp) {

            ...

Вывод: невозможно подключиться к ssl: //gateway.sandbox.push.apple.com: 2195 (соединение отклонено)

спасибо

1 Ответ

2 голосов
/ 19 сентября 2011

Код выглядит в основном правильно.Я хотел бы предложить, что вам не нужен цикл (у меня никогда не было);и это может даже вызвать проблемы, если вы пересылаете одни и те же запросы.Я не уверен, почему у вас могут быть какие-то успехи и неудачи, я обнаружил, что серверы APN довольно последовательны.

Одна деталь, которую нужно проверить: используемый вами код PHP не включает пароль вопции ssl;это необходимо, если используемый вами файл pem защищен паролем.(См. Код ниже, например)

Я бы рекомендовал повторно проверить учетные данные, с которыми вы проходите аутентификацию.Лучший способ сделать это - использовать openssl (из терминала), как описано в техническом замечании Apple по устранению неполадок 2265: http://developer.apple.com/library/ios/#technotes/tn2265/_index.html. Я написал хорошее руководство по следующему вопросу SO: Не удалосьвозможность подключения к серверу APNS Sandbox

После проверки файла pem, вы можете попробовать использовать следующий код PHP (украденный с моей тестовой страницы):

// Put your private key's passphrase here:
$passphrase = 'p-a-s-s-p-h-r-a-s-e';

$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'CertificateAndPrivateKey.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);

// Open a connection to the APNS server
$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);

echo 'Connected to APNS' . PHP_EOL;

Надеюсь, это поможет.

...