如何将推送通知发送到多个设备?

如何将推送通知发送到多个设备?

问题描述:

这是我第一次在App中使用推送通知。我已经通过示例应用程序以及书籍了解了如何将推送通知发送到单个设备。但是,我的程序发送推送通知给多个设备。我使用'PushMeBaby'应用程序进行服务器端编码。 请帮我一把。 在此先感谢。如何将推送通知发送到多个设备?

+0

您可以检查我在这里做http://stackoverflow.com/questions/14563097/sending-multiple-iphone-push-notifications-apns-php - 教程 – 2013-05-17 05:08:46

尝试此示例代码并根据您的环境进行修改。

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

这篇文章可以帮助验证点连接和连接状态:Apple Push Notification: Sending high volumes of messages

其他参考链接:

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

+0

感谢您的回复!!!很高兴看到答复soon.But我已经经历了这些问题:(我需要如何我可以获得所有设备令牌到我的服务器,然后如何通过单一连接发送通知他们的描述。这似乎是一个非常基本的问题,但由于我是新的我没有得到如何做到这一点。请帮助 – Yogi 2011-04-13 05:22:56

+0

我张贴示例代码,希望它可以给你一个方向 – Priyank 2011-04-13 15:45:32

+0

感谢Priyank,我有你的逻辑确定它会工作,虽然我改变了编码的语言。我是对吗? – Yogi 2011-04-14 04:42:31

我发现,你必须创建一个新的stream_context_create每个fwrite都会阻止苹果关闭坏连接。

+0

发送每个通知后,您可以简单地调用'fread($ socket)':如果返回'FALSE',则重新创建套接字。你也可以把你的发送放在try&catch中,然后自动重新创建套接字并重新发送通知(为了以防万一,可能需要重试最多次数)。 – user276648 2014-02-28 01:15:25

这是我做了什么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!'; 
      }