Intereting Posts
Ошибка синтаксиса PHP в настройке глобальной переменной Laravel: пользовательский корневой ключ Dingo / API Pagination Найти комбинацию (ы) суммы элементов (элементов) в массиве, сумма которых равна заданному числу xpath найти абсолютный путь есть ли простой способ? Как отформатировать число до суммы в долларах в PHP poedit обходной путь для динамического gettext Переменная привязки для имени столбца в PHP для запроса Postgresql Как полностью загружать звук перед воспроизведением? PHP простой HTML DOM Parser возвращает тарабарщину Самый короткий способ проверить, содержит ли переменная положительное целое число с помощью PHP? Ajax не работает в цикле Неустранимая ошибка: вызовите функцию-член функции count () для не-объекта в Удаление элементов из массива, если они существуют в другом массиве Многомерный поиск массива с использованием php php: как предотвратить SQL-инъекцию из $ _POST

Технология PHP для запроса сервера обратной связи APNs

Может ли кто-нибудь уточнить, что APN (Apple Push Notification) хочет, насколько вы его запрашиваете?

Документы говорят, что он начинает отправлять, как только будет установлено соединение. Означает ли это, что я не нахожусь на нем?

Вот мой текущий код, чтобы попробовать его прочитать. Я не помещал fread() в цикле, так как не знаю, какой ответ указывает «больше нет записей для чтения», и я не хотел бесконечного цикла на моем сервере.

 <?php $apnsCert = 'HOHRO-prod.pem'; $streamContext = stream_context_create(); stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert); stream_context_set_option($streamContext, 'ssl', 'verify_peer', false); $apns = stream_socket_client('ssl://feedback.push.apple.com:2196', $error, $errorString, 60, STREAM_CLIENT_CONNECT, $streamContext); echo 'error=' . $error; echo 'errorString=' . $errorString; $result = fread($apns, 38); echo 'result=' . $result; fclose($apns); ?> 

Пока все, что я получаю, это пустой ответ. Ошибок нет, поэтому он подключается.

Я не знаю, означает ли нулевой ответ отсутствие данных, или мой fread() – это неправильный способ сделать это.

благодаря

Related of "Технология PHP для запроса сервера обратной связи APNs"

Вот большой вопрос, который меня смутил, когда я впервые попытался подключиться: серверы обратной связи APNS возвращают только токены устройства, которые «истекли» с момента последнего запроса обратной связи . Это означает, что большую часть времени вы получите ответ NULL, если вы уже имеете дело с большим количеством пользователей вашего приложения.

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

Вот полная функция для получения токенов устройства с серверов обратной связи APNS (спасибо за ответы выше, чтобы помочь мне собрать все вместе):

 function send_feedback_request() { //connect to the APNS feedback servers //make sure you're using the right dev/production server & cert combo! $stream_context = stream_context_create(); stream_context_set_option($stream_context, 'ssl', 'local_cert', '/path/to/my/cert.pem'); $apns = stream_socket_client('ssl://feedback.push.apple.com:2196', $errcode, $errstr, 60, STREAM_CLIENT_CONNECT, $stream_context); if(!$apns) { echo "ERROR $errcode: $errstr\n"; return; } $feedback_tokens = array(); //and read the data on the connection: while(!feof($apns)) { $data = fread($apns, 38); if(strlen($data)) { $feedback_tokens[] = unpack("N1timestamp/n1length/H*devtoken", $data); } } fclose($apns); return $feedback_tokens; } 

Если все хорошо, возвращаемые значения из этой функции будут выглядеть примерно так (через print_r ()):

 Array ( Array ( [timestamp] => 1266604759 [length] => 32 [devtoken] => abc1234..............etcetc ), Array ( [timestamp] => 1266604922 [length] => 32 [devtoken] => def56789..............etcetc ), ) 

Этот код выглядит правильно, однако вам нужно выполнить цикл и проверить конец потока, чтобы прочитать все коды устройств.

  while (!feof($apns)) { $devcon = fread($apns, 38); } 

Однако моя проблема заключается в фактической распаковке данных. Кто-нибудь знает, как распаковать двоичные данные, которые вы только что прочитали, чтобы получить фактический идентификатор устройства (как строку) вместе с меткой времени и т. Д.?

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

«Ну, как ни глупо, как это звучит, я нашел решение:

Создайте фиктивный идентификатор приложения на портале программы, включите уведомления о создании push на нем. Создайте и загрузите связанный профиль обеспечения. Создайте новый проект xcode и вызовите метод registerForRemoteNotificationTypes при запуске. Установите фиктивное приложение на свое устройство. На этом этапе на вашем устройстве должно быть два приложения РАЗРАБОТКИ: оригинальное приложение и фиктивное приложение. Оба должны быть зарегистрированы для получения push-уведомлений. Удалите исходное приложение и попробуйте отправить push-уведомление этому приложению. Вызовите службу обратной связи, и вы должны получить данные обратно ».

Это, наконец, сработало для меня.

 $arr = unpack("H*", $devconts); $rawhex = trim(implode("", $arr)); $feedbackTime = hexdec(substr($rawhex, 0, 8)); $feedbackDate = date('Ymd H:i', $feedbackTime); $feedbackLen = hexdec(substr($rawhex, 8, 4)); $feedbackDeviceToken = substr($rawhex, 12, 64); 

И тогда вы просто проверяете токен устройства на отметку времени!

Просто начал использовать эту библиотеку – отлично работает для меня!

https://github.com/mac-cain13/notificato