How to send Push Notification to multiple devices?

前端 未结 3 1550
逝去的感伤
逝去的感伤 2020-12-23 15:01

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 d

相关标签:
3条回答
  • 2020-12-23 15:18

    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!';
                }
    
    0 讨论(0)
  • 2020-12-23 15:21

    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?

    0 讨论(0)
  • 2020-12-23 15:31

    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.

    0 讨论(0)
提交回复
热议问题