Push-уведомление не получено на iphone - PullRequest
8 голосов
/ 15 ноября 2011

Я использую этот учебник для изучения 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 я также воссоздаю профили инициализации, старую удалить один, устанавливаю новый профиль. Я запускаю приложение, которое дает мне идентификатор устройства, а затем я подключаю как серверную изолированную программную среду, так и рабочую, чтобы отправлять push-уведомления с их относительными push-профилями, но я все еще не могу получать push-уведомления на моем устройстве.

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

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

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


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


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

Ответы [ 5 ]

7 голосов
/ 24 ноября 2011

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

  • Приложение скомпилировано с возможностью отладки / выпуска
  • ваш брелок имеет сертификат push-уведомлений о разработке / производстве

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

<?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);

?>
2 голосов
/ 12 января 2012

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

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

2 голосов
/ 22 ноября 2011

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

1 голос
/ 22 ноября 2011

Используйте UrbanAirShip.На мой взгляд, это лучшее решение на стороне сервера, так как оно включает в себя уведомления Push-alike для 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);
?>
1 голос
/ 21 ноября 2011

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

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

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

Учебное пособие по Apple Push Notification:

спасибо,

MinuMaster

...