PHP Apple APNS читать НЕМЕДЛЕННЫЙ код состояния уведомления

в течение последних 3 дней я пытался заставить все работать с моим PHP-кодом и apns.

Пока я могу доставлять уведомления (у меня только одно устройство, поэтому я не знаю, работает ли это для нескольких устройств).

Когда я пытаюсь протестировать отправку одного уведомления для 2 устройств, где первое - недействительный токен устройства (изобретенный мной), а второй - токен моего устройства, я не могу доставить уведомление на мое устройство ... Из того, что я читал, когда уведомление нечитаемо или ошибочно, apns завершает соединение и отправляет ошибку длиной 6 байт, где 2-й байт (status_code) является типом ошибки. Если ошибок не происходит, я все еще не могу понять, отправляет ли apns status_code 0 (ошибок не обнаружено) или он вообще ничего не отправляет.

Пока мне не удалось найти этот status_code, несмотря на то, что я следовал нескольким кодам, найденным в Интернете.

КОД

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

// Create the payload body
    //file_put_contents('logs/debug_not.log', 'body'. "\n", FILE_APPEND);
    $body['aps'] = array(
        'alert' => $message,
        'sound' => 'default'
    );

    // Encode the payload as JSON
    //file_put_contents('logs/debug_not.log', 'json body'. "\n", FILE_APPEND);
    $payload = json_encode($body);
    $open = true;
    foreach ($devices as $device) {
        //file_put_contents('logs/debug_not.log', 'inicio ciclo'. "\n", FILE_APPEND);
        if($open == true){
            //file_put_contents('logs/debug_not.log', 'abrir ligacao'. "\n", FILE_APPEND);
            // Open a connection to the APNS server
            $fp = stream_socket_client(
                    'ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT, $ctx);

            if (!$fp){
               //file_put_contents('logs/debug_not.log', 'erro abrir ligacao'. "\n", FILE_APPEND);
               throw new \Exception;
            }
        }
        // Build the binary notification
        //file_put_contents('logs/debug_not.log', 'criar payload'. "\n", FILE_APPEND);
        $msg = chr(0) . pack('n', 32) . pack('H*', str_replace(' ', '', $device['token'])) . pack('n', strlen($payload)) . $payload;


        // Send it to the server
        //file_put_contents('logs/debug_not.log', 'enviar payload'. "\n", FILE_APPEND);
        $result = fwrite($fp, $msg, strlen($msg));
        stream_set_blocking ($fp, 0);    

        $errorResponse = @fread($apns, 6);
        //if i var_dump($errorResponse) it gives me null/false all the time, no matter what             

        //this is my workaround for invalid device tokens-- its not working or at least is not send the valid tokens
        if(!$result || !$fp)
        {

            //file_put_contents('logs/debug_not.log', 'erro na not '. chr($data["status_code"]). "\n", FILE_APPEND);
            fclose($fp);
            $open = true;
        } else{
            //file_put_contents('logs/debug_not.log', 'suc na not'. "\n", FILE_APPEND);
            $open = false;
        }
        //file_put_contents('logs/debug_not.log', 'fim ciclo'. "\n", FILE_APPEND);
    }
    // Close the connection to the server
    if($fp){
        //file_put_contents('logs/debug_not.log', 'fechar connection'. "\n", FILE_APPEND);
        fclose($fp);
    }

fread в моем соединении все время выдает null / false, даже когда я получаю свое уведомление или пытаюсь использовать неправильный токен.

Моя логика подключения после ошибки, похоже, не работает.

может, пожалуйста, кто-нибудь мне поможет ??? Я не собираюсь использовать третьи классы или код, хотел бы иметь простой базовый, работающий с массивом токенов устройств, даже если есть некоторые, которые apns выдают ошибку.

Всем спасибо.


person FEST    schedule 22.08.2013    source источник
comment
Хорошо, поэтому кажется, что сначала ... я отправляю простой формат, и поэтому я все время получаю false при подключении к сокету fread (apns не отправляет ошибку в простом формате). Я обновляю свою форму, создавая сообщение   -  person FEST    schedule 23.08.2013
comment
У меня точно такая же проблема. Подскажите, пожалуйста, решила ли смена формата вашу проблему? И если да, то что вы подразумеваете под простым форматом? Как называется другой формат и в чем разница? Был бы очень признателен некоторый исходный код!   -  person Kup    schedule 05.12.2013


Ответы (2)


Вы подключились как $fp = stream_socket_client ......

и вы пытаетесь $errorResponse = @fread($apns, 6);, который никогда не даст вам никакого вывода, поскольку $ apns не определен.

Скорее вам следует сделать это:

$errorResponse = @fread($fp, 6);

и ваш код будет работать нормально

person Pratik Solanki    schedule 20.07.2015

Если вы получаете сообщение об ошибке (скорее всего, в вашем случае, потому что ваш изобретенный токен устройства не существует на серверах Apple для вашего приложения), то сообщение об ошибке возвращается непосредственно перед закрытием соединения. Если сообщение прошло успешно, ответа нет, но соединение остается открытым.

Вот как с этим справиться:

  1. Отправьте свое сообщение.
  2. Прочитать ошибку с таймаутом (или в неблокирующем режиме). Если вы получили ответ с ошибкой, сообщение не было отправлено. (Вам понадобится новое соединение.)
  3. Если время чтения истекает (или ничего не возвращает в неблокирующем режиме), сообщение может быть успешным. (Ничего не делать.)
  4. Отправьте следующее сообщение. Если отправка прошла успешно (все еще подключено), последнее сообщение определенно было успешным.

Следите за своим последним успешным сообщением. Вы всегда можете отслеживать серию сообщений, отправив сообщение своему устройству, чтобы предотвратить любые ложные срабатывания.

Вы можете проверить исходный код EasyAPNS, который представляет собой PHP-реализацию этого . Кроме того, вы можете прочитать подробности в документации Apple: Связь поставщика со службой push-уведомлений Apple

person Marcus Adams    schedule 22.08.2013
comment
Это была теория, которой я следовал ... и я проверил код EasyAPNS, у них есть fread (соединение сокета), как и у меня, но для меня результат всегда ложный / нулевой. :( - person FEST; 23.08.2013
comment
@FEST ты вообще хоть куда-нибудь попадал? Я имею дело с той же проблемой, и мне нужно определить статус, чтобы увидеть, какие токены устройств являются проблемой, чтобы я мог удалить их из своей базы данных. - person tamak; 11.03.2015