2013-06-14 4 views
1

Это не мое первое приложение, отправляющее push-уведомления, но это мое первое приложение, в котором я отправляю уведомление всем моим пользователям одновременно.Как правильно отправлять push-уведомления

Что я испытываю, так это то, что не все мои пользователи получают уведомление, только некоторые из них, даже если у них есть правильные настройки (т. Е. Уведомления для моего приложения включены), также правильный код, поскольку он отправляется на некоторые из них их, так что я предполагаю, что код «пропускает» некоторые исполнения, так как связь с APNS настолько асинхронна, что так или иначе (вы говорите мне, если я ошибаюсь), что она помещает очередь отправки уведомлений.

Вот код:

function sendNotification(){ 

$sql = "SELECT * FROM users WHERE phone = 'iPhone' AND pushID != ''"; 
try { 
    $db = getConnection(); 
    $stmt = $db->prepare($sql); 
    $stmt->execute(); 
    $users = $stmt->fetchAll(PDO::FETCH_OBJ); 

    $request = Slim::getInstance()->request(); 
    $content = json_decode($request->getBody()); 
    $message = $content->message; 

    foreach($users as $user){ 

      // Put your device token here (without spaces): 
      $deviceToken = $user->pushID; 


      // Put your private key's passphrase here: 
      $passphrase = 'xxxxxxx'; 

      //////////////////////////////////////////////////////////////////////////////// 

      $ctx = stream_context_create(); 
      stream_context_set_option($ctx, 'ssl', 'local_cert', 'xxxxx.pem'); 
      stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); 

      // Open a connection to the APNS server 
      $fp = stream_socket_client(
       'ssl://gateway.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)); 

      if (!$result) 
       echo 'Message not delivered' . PHP_EOL; 
      else 
       echo 'Message successfully delivered' . PHP_EOL; 

      // Close the connection to the server 
      fclose($fp); 

    } 
    $db = null; 
} catch(PDOException $e) { 
    echo '{"error":{"text":'. $e->getMessage() .'}}'; 
} 
} 

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

Im использование Slim для этого.

надеюсь, что вы можете мне помочь, спасибо!

ответ

2

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

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

Предлагаю вам прочитать раздел Push Notification Throughput and Error Checking в this document для получения дополнительной информации.

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

+0

У меня была такая же проблема здесь - http://stackoverflow.com/questions/17116249/batch-multiple-ios-push-notification-code-works-for-2-devices-but-not-for-1. Это действительно был один плохой токен устройства в верхней части моей таблицы db, который останавливал уведомления, отправляемые на каждое устройство. –

+0

Я попробовал только сейчас, чтобы отправить уведомление всем моим пользователям, но через режим сандокса, который должен был дать ошибку, так как ни один из моих токенов не является разработкой и неясно, что я получил, было «Сообщение успешно отправлено», действительно ли яблоко отвечает на все но «ВСЕ ОК»? – subharb

+0

@subharb Это зависит от того, сколько уведомлений вы отправляете и как быстро. Если вы отправляете, например, 10 уведомлений одновременно (и некоторые из них с недопустимыми токенами устройства), вероятно, вы не увидите никакого исключения, и вам кажется, что все они были успешно отправлены. В следующий раз, когда вы попытаетесь отправить уведомления через один и тот же сокет, вы получите исключение. Apple никогда не отвечает «ВСЕ ОК». Он отправляет ответ только тогда, когда возникает ошибка, и только если вы используете расширенный двоичный формат. Прочтите ссылку, которую я поставил в своем ответе для получения более подробной информации. – Eran

Смежные вопросы