Push-уведомление не получает на iphone

Я использую этот учебник для изучения push-уведомления.

<?php // Put your device token here (without spaces): $deviceToken = '1675ba8bb005740bb514222227f861c30230a81e6eed6bb6b8f353c57831341d'; // Put your private key's passphrase here: $passphrase = '111134'; // Put your alert message here: $message = 'My first push notification!'; //////////////////////////////////////////////////////////////////////////////// $ctx = stream_context_create(); stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem'); stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); // 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) exit("Failed to connect: $err $errstr" . PHP_EOL); echo 'Connected to APNS' . PHP_EOL; // Create the payload body $body['aps'] = array( 'alert' => $message, 'sound' => 'default' ); // Encode the payload as JSON $payload = json_encode($body); // Build the binary notification $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload; // Send it to the server $result = fwrite($fp, $msg, strlen($msg)); echo 'result =' . $result. PHP_EOL; if (!$result) echo 'Message not delivered' . PHP_EOL; else echo 'Message successfully delivered' . PHP_EOL; // Close the connection to the server fclose($fp); 

Я также настраиваю приложение для push-уведомления. После настройки для push i также создайте профили подготовки, старый удалите один, установите новый профиль. Я запускаю приложение, которое дает мне идентификатор устройства, а затем подключаю как серверную песочницу, так и продукцию для отправки push-уведомлений с их относительными профилями push, но все же я не могу получать push-уведомления на своем устройстве.

Я также устанавливаю ipusher на свое устройство и проверяю push-уведомление. они поступают из этого приложения.

Одна странная вещь, которую я замечаю, заключается в том, что я изменяю свой идентификатор приложения и использую любой другой идентификатор приложения, тогда токен устройства остается таким же

Теперь моя проблема в том, что я не получаю push-уведомление на своем устройстве.


Проблема не в моих профилях. Может быть, это код PHP, который я использую, потому что, когда я использую простые apns на удаленном сервере, он отправляет push-уведомления. Время получения уведомлений составляло от 6 до 7 часов. Я думаю, что это связано с сетевой проблемой на моей стороне устройства. Но теперь он работает нормально через 2 дня по профилю производства. Теперь уведомление не требует времени для доставки на моем устройстве, но на некоторых устройствах занимает от 30 секунд до 5 минут.


Еще одна проблема может возникнуть, если вы не получаете push-уведомления на своем устройстве и из других приложений, тогда вы должны проверить свой DNS для подключения.

Сначала убедитесь, что вы используете:

  • Приложение скомпилировано с предоставлением отладки / выпуска
  • ваш брелок имеет сертификат уведомления о выпуске / выпуске продукции

затем используйте следующий код (был протестирован как dev & production)

 <?php // Comment these lines in production mode ini_set('display_errors','on'); error_reporting(E_ALL); // Apns config // true - use apns in production mode // false - use apns in dev mode define("PRODUCTION_MODE",false); $serverId = 1; $serverName = 'my-server-domain.com'; if(PRODUCTION_MODE) { $apnsHost = 'gateway.sandbox.push.apple.com'; } else { $apnsHost = 'gateway.push.apple.com'; } $apnsPort = 2195; if(PRODUCTION_MODE) { // Use a development push certificate $apnsCert = $_SERVER['DOCUMENT_ROOT'].'/apns/apns-dominos-development.pem'; } else { // Use a production push certificate $apnsCert = $_SERVER['DOCUMENT_ROOT'].'/apns/apns-dominos-production.pem'; } // --- Sending push notification --- // Insert your device token here $device_token = "<dc6127d8 dc6127d8 dc6127d8 dc6127d8 dc6127d8 dc6127d8 dc6127d8 dc6127d8>"; // Some Device Token // Notification content $payload = array(); //Basic message $payload['aps'] = array( 'alert' => 'testing 1,2,3..', 'badge' => 1, 'sound' => 'default', ); $payload['server'] = array( 'serverId' => $serverId, 'name' => $serverName ); // Add some custom data to notification $payload['data'] = array( 'foo' => "bar" ); $payload = json_encode($payload); $streamContext = stream_context_create(); stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert); stream_context_set_option($streamContext, 'ssl', 'passphrase', ""); $apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext); $deviceToken = str_replace(" ","",substr($device_token,1,-1)); echo $deviceToken; $apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceToken)) . chr(0) . chr(mb_strlen($payload)) . $payload; fwrite($apns, $apnsMessage); //socket_close($apns); fclose($apns); ?> 

Внедрите службу обратной связи на стороне сервера, а также проверьте на стороне сервера, что в течение продолжительности все токен устройства отправляется в APNS. Из службы обратной связи, по крайней мере, вы узнаете, сколько устройств получили уведомление об ур. Если все токен устройства отправляется один за другим в APN, и APN не отправляют какой-либо список через службу обратной связи, то вы не можете обрабатывать продолжительность приема уведомлений на устройствах.

Хорошо, наконец, я получил свою проблему. Проблема не в коде, на самом деле проблема заключается в неправильном значении DNS, установленном в моем iphone. Iphone автоматически устанавливает ip моего маршрутизатора для поля DNS. Теперь я даю значение DNS моего поставщика услуг, тогда он отлично работает. Теперь я получаю Push-сообщения, как только я их отправил.

Надеюсь, это помогает другим.

Проверьте сертификат push-уведомления. сертификат является ассоциированным с любым закрытым ключом?

Если нет, то, пожалуйста, заново создайте сертификат push-уведомления с соответствующим закрытым ключом, который генерируется из вашей ключевой цепи.

Пожалуйста, ознакомьтесь с нижеприведенным учебным пособием:

Apple Push Notification Tutorial:

благодаря,

MinuMaster

Используйте UrbanAirShip. По-моему, это лучшее решение на стороне сервера, поскольку оно включает Push-подобные уведомления для Android (C2DM) и Blakberry.

Попробуйте найти различия между этими файлами и понять их. Возможно, это решение вашей проблемы. Вот мой код:

 <?php $message = 'Hello'; // $_GET or $_POST $badge = 3; // int $sound = 'default'; // string - sound name $development = true; // boolean $payload = array(); $payload['aps'] = array('alert' => $message, 'badge' => intval($badge), 'sound' => $sound); $payload = json_encode($payload); $apns_url = NULL; // Set Later $apns_cert = NULL; // Set Later $apns_port = 2195; if($development) { $apns_url = 'gateway.sandbox.push.apple.com'; $apns_cert = '/path/apns.pem'; // relative address to an App Specific Certificate file } else { $apns_url = 'gateway.push.apple.com'; $apns_cert = '/path/cert-prod.pem'; } $stream_context = stream_context_create(); stream_context_set_option($stream_context, 'ssl','local_cert',$apns_cert); $apns = stream_socket_client('ssl://'.$apns_url.':'.$apns_port,$error,$error_string,2,STREAM_CLIENT _CONNECT,$stream_context); // You will need to put your device tokens into the $device_tokens array yourself $device_tokens = array(); // tokens!!! foreach($device_tokens as $device_token) { $apns_message = chr(0).chr(0).chr(32).pack('H*',str_replace(' ','',$device_token)).chr(0).chr(strlen($payload)).$payload; fwrite($apns, $apns_message); } @socket_close($apns); @fclose($apns); ?>