2011-04-12 25 views
22

Esta es la primera vez que uso notificaciones automáticas en mi aplicación. He revisado las aplicaciones de muestra junto con los libros y obtuve la forma de enviar notificaciones automáticas a un solo dispositivo. Pero no entiendo exactamente qué cambios debo hacer en mi programa para enviar notificaciones automáticas a múltiples dispositivos. Estoy usando la aplicación 'PushMeBaby' para la codificación del lado del servidor. Por favor, ayúdame. Gracias de antemano.¿Cómo enviar una notificación push a múltiples dispositivos?

+0

Puede comprobar lo que he hecho aquí http://stackoverflow.com/questions/14563097/sending-multiple-iphone-push-notifications-apns-php -tutorial –

Respuesta

28

Pruebe este código de ejemplo y modifíquelo para su entorno.

$apnsHost = '<APNS host>'; 
    $apnsPort = <port num>; 
    $apnsCert = '<cert>'; 

    $streamContext = stream_context_create(); 
    stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert); 

    $apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 60, STREAM_CLIENT_CONNECT, $streamContext); 

    $payload['aps'] = array('alert' => 'some notification', 'badge' => 0, 'sound' => 'none'); 
    $payload = json_encode($payload); 

// Note: $device_tokens_array has list of 5 devices' tokens 

    for($i=0; $i<5; $i++) 
    { 
      $apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $device_tokens_array[i])) . chr(0) . chr(strlen($payload)) . $payload; 

      fwrite($apns, $apnsMessage); 
    }?> 

este artículo ayude a verificar terminar la conexión y el estado de conexión: Apple Push Notification: Sending high volumes of messages

Otros enlaces de referencia:

How can I send push notification to multiple devices in one go in iPhone? y how to handle multiple devices when using Push Notification?

+0

Gracias por responder !!! Es bueno ver respuestas pronto.Pero ya he respondido a estas preguntas :(Necesito una descripción de cómo puedo obtener todos los tokens del dispositivo en mi servidor y cómo enviarles notificaciones en una sola conexión. Puede parecer una pregunta muy básica para usted, pero como soy nuevo, no estoy obteniendo cómo hacerlo. Por favor, ayuda – Yogi

+0

Publiqué código de muestra esperando que pueda darle una dirección. – Priyank

+0

Gracias Priyank, obtuve su lógica y Estoy seguro de que funcionará aunque cambié el lenguaje de la codificación. ¿Estoy en lo cierto? – Yogi

2

me encontré con que usted tiene que crear una nueva stream_context_create de cada fwrite para evitar que Apple cierre la conexión para un token malo.

+0

Puede simplemente llamar a 'fread ($ socket)' después de enviar cada notificación: si devuelve 'FALSE', vuelva a crear el socket. También podría poner su envío en un try & catch y recrear automáticamente el socket y volver a enviar la notificación (probablemente con un número máximo de reintentos, por las dudas). – user276648

1

Esto es lo que he hecho here

<?php 
     set_time_limit(0); 
     $root_path = "add your root path here"; 
     require_once($root_path."webroot\cron\library\config.php"); 
     require_once($root_path."Vendor\ApnsPHP\Autoload.php"); 

      global $obj_basic;   
      // Basic settings 

      $timezone = new DateTimeZone('America/New_York'); 
      $date = new DateTime(); 
      $date->setTimezone($timezone); 
      $time = $date->format('H:i:s'); 


      //Get notifications data to send push notifications 
      $queueQuery = " SELECT `notifications`.*, `messages`.`mes_message`, `messages`.`user_id`, `messages`.`mes_originated_from` FROM `notifications` 
              INNER JOIN `messages` 
              ON `notifications`.`message_id` = `messages`.`mes_id` 

              WHERE `notifications`.`created` <= NOW()"; 

      $queueData = $obj_basic->get_query_data($queueQuery); 

      if(!empty($queueData)) { 

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

      $ctx = stream_context_create(); 
      stream_context_set_option($ctx, 'ssl', 'local_cert', 'server_certificates_bundle_sandbox.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 '<br>'.date("Y-m-d H:i:s").' Connected to APNS' . PHP_EOL; 

       foreach($queueData as $val) { 
         // Put your device token here (without spaces): 
         $deviceToken = $val['device_token']; 

         // Create message 

          // Get senders name 
          $sql = "SELECT `name` FROM `users` WHERE id =".$val['user_id']; 
          $name = $obj_basic->get_query_data($sql); 
          $name = $name[0]['name']; 
          $message = $name." : "; 

          // Get total unread messaged for receiver 
          $query = "SELECT COUNT(*) as count FROM `messages` WHERE mes_parent = 0 AND user_id = ".$val['user_id']." AND mes_readstatus_doc != 0 AND mes_status = 1"; 
          $totalUnread = $obj_basic->get_query_data($query); 
          $totalUnread = $totalUnread[0]['count']; 



          $message .= " This is a test message."; 


         // Create the payload body 
         $body['aps'] = array(
           'alert'   => $message, 
           'badge'  => $totalUnread, 
           '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 '<br>'.date("Y-m-d H:i:s").' Message not delivered' . PHP_EOL; 
         } else { 
          $sqlDelete = "DELETE FROM `notifications` WHERE id = ".$val['id']; 
          $query_delete = $obj_basic->run_query($sqlDelete,'DELETE'); 

          echo '<br>'.date("Y-m-d H:i:s").' Message successfully delivered' . PHP_EOL; 
         } 
       } 
       // Close the connection to the server 
       fclose($fp); 
       echo '<br>'.date("Y-m-d H:i:s").' Connection closed to APNS' . PHP_EOL; 
      } else { 
       echo '<br>'.date("Y-m-d H:i:s").' Queue is empty!'; 
      } 
Cuestiones relacionadas