23

This is the first time I am using push notification in my App. I have gone through sample applications along with books and I got how to send push notification to a single device. But I am not getting exactly what changes should I do in my program to send push notification to multiple devices. I am using 'PushMeBaby' application for server side coding. Please, help me out.

Harsh Patel
  • 6,334
  • 10
  • 40
  • 73
Yogi
  • 268
  • 1
  • 2
  • 8
  • You can check what I have done here http://stackoverflow.com/questions/14563097/sending-multiple-iphone-push-notifications-apns-php-tutorial – Subodh Ghulaxe May 17 '13 at 05:08

3 Answers3

31

Try this example code and modify for your environment.

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

This article helps verifying drop connection and connection status: Apple Push Notification: Sending high volumes of messages

Other reference links:

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

Community
  • 1
  • 1
Priyank
  • 10,503
  • 2
  • 27
  • 25
  • Thanks for replying!!!Nice to see replies soon.But I have already gone through these questions:( I need description of how I can get all device tokens to my server and then how to send them notification in single connection.It may seem a very basic question to you but as I am new I am not getting how to do this.Please help – Yogi Apr 13 '11 at 05:22
  • Thanks Priyank,I got your logic and sure about it will work though I changed the language of coding.Am I right? – Yogi Apr 14 '11 at 04:42
  • I recommend you first try it for your preferred code and situation. I am novice to Android. – Priyank Apr 14 '11 at 15:24
  • Hay,I was not asking this for android.I am also novice to Android – Yogi Apr 15 '11 at 06:29
  • sorry, i meant iphone only ;) – Priyank Apr 15 '11 at 14:18
  • @Priyank:If I used my .cer file used for one project supporting push notification,can I use it again for another one if I re-download it? – Yogi Apr 15 '11 at 14:24
  • 1
    I am using same code but still I am receiving notifications only first two devices not for all [ I am sending notifications on 7 devices]. – Raghbendra Nayak Jul 24 '15 at 13:39
2

I found that you have to create a new stream_context_create for each fwrite to prevent apple from closing the connection for a bad token.

DigiMee
  • 51
  • 2
  • You may be able to simply call `fread($socket)` after sending each notification: if it returns `FALSE`, recreate the socket. You could also put your send in a try&catch and automatically recreate the socket and resend the notification (probably with a max number of retries, just in case). – user276648 Feb 28 '14 at 01:15
1

This is what I have done 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!';
            }
Community
  • 1
  • 1
Subodh Ghulaxe
  • 18,333
  • 14
  • 83
  • 102