обработка ошибок — Метод обработки токенов устройства для службы push-уведомлений Apple с переполнением стека

На этом сайте много информации о том, как обрабатывать ошибки, возвращаемые асинхронно из службы Apple Push Notification в PHP. Я придумал метод в PHP, который, кажется, работает довольно хорошо, но я хотел бы получить некоторую обратную связь.

  1. Правильно ли использовать fflush ()? Я видел это в некоторых примерах, но не во всех.
  2. Я не могу заставить его выдать ошибку за заведомо плохой токен устройства. Зачем?
  3. Является ли это решение масштабируемым для тысяч устройств (предположим, что максимальная память PHP увеличена достаточно)?
  4. Другие вопросы?

Заметки:
— Маркеры устройств для уведомления в начале хранятся в массиве.
— Он не асинхронный, но проверяет наличие (прошлых) ошибок после отправки каждого уведомления и проверяет еще раз целую секунду после последнего уведомления.
— Он использует более новый «современный» формат уведомлений, в отличие от оригинальных или расширенных форматов.
— Он отправляет индекс массива токенов в качестве идентификатора в APNS.
— Он использует функцию checkAppleErrorResponse (), которая считывает первые 6 байтов и возвращает либо false, либо идентификатор (индекс), который не удался, так что он может выполнить резервное копирование и продолжить со следующим токеном. (Все токены, отправленные после сбоя, становятся недействительными.)

$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'passphrase', $iosCertPassphrase);
stream_context_set_option($ctx, "ssl", "local_cert", $iosCertKey);
$fp = NULL;
$errno = NULL;
$errstr = NULL;

// same payload for all
$item2 = chr(2) . pack("n", strlen($payload)) . $payload; // payload item has id 2, a 2-byte length ("n") containing length of payload, then payload

$errorID = -1;

while ($errorID !== false) {
$fp = stream_socket_client($iosHost . ':' . $iosPort, $errno, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);

if ($fp === FALSE) {
echo('Failed to create socket');
break;
}

stream_set_blocking($fp, 0);

for ($id = $errorID + 1 ; $id < sizeof($iosTokens); $id++) {
$errorID = false;
$item1 = chr(1) . pack('n', 32) . pack("H*", $iosTokens[$id]['device_token']); // device token item has 1-byte id 1, 2-byte length ("n") containing 32, then 32-byte device token

$item3 = chr(3) . pack('n', 4) . pack('N', $id); // notification identifier has 1-byte id 3, 2-byte length ("n") containing 4, then 4-byte identifier

$frame = $item1 . $item2 . $item3;

$msg = chr(2) . pack("N", strlen($frame)) . $frame; // for "modern" push notification format, msg has 1-byte id 2, 4-byte length ("N") containing the length of the frame, then frame

fwrite($fp, $msg);

$errorID = checkAppleErrorResponse($fp);
fflush($fp);

if ($errorID !== false) // if there's an error, stop now
break;
}

// if done with for loop and no errors, pause for a sec and check one last time
if ($errorID === false) {
$read = array($fp);
$null = null;
$changedStreams = stream_select($read, $null, $null, 0, 1000000);

//check if it is actually false
if ($changedStreams === false)
{
//close stream when done.
socket_close($fp);
fclose($fp);
}
elseif ($changedStreams > 0)
{
// set the error and redo starting after errorID index
$errorID = checkAppleErrorResponse($fp);
}
}
}
}

8

Решение

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

http://www.raywenderlich.com/2941/how-to-write-a-simple-phpmysql-web-service-for-an-ios-app

0

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector