2011-04-12 197 views
22

這是我第一次在App中使用推送通知。我已經通過示例應用程序以及書籍瞭解瞭如何將推送通知發送到單個設備。但是,我的程序發送推送通知給多個設備。我使用'PushMeBaby'應用程序進行服務器端編碼。 請幫我一把。 在此先感謝。如何將推送通知發送到多個設備?

+0

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

回答

28

嘗試此示例代碼並根據您的環境進行修改。

$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

2

我發現,你必須創建一個新的stream_context_create每個fwrite都會阻止蘋果關閉壞連接。

+0

發送每個通知後,您可以簡單地調用'fread($ socket)':如果返回'FALSE',則重新創建套接字。你也可以把你的發送放在try&catch中,然後自動重新創建套接字並重新發送通知(爲了以防萬一,可能需要重試最多次數)。 – user276648 2014-02-28 01:15:25

1

這是我做了什麼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!'; 
      } 
相關問題