【问题标题】:How to send Push Notification to multiple devices?如何向多个设备发送推送通知?
【发布时间】:2011-08-03 13:59:18
【问题描述】:

这是我第一次在我的应用程序中使用推送通知。我已经浏览了示例应用程序和书籍,并且了解了如何将推送通知发送到单个设备。但是我没有确切地知道我应该在我的程序中进行哪些更改以将推送通知发送到多个设备。我正在使用“PushMeBaby”应用程序进行服务器端编码。 请帮帮我。

【问题讨论】:

标签: iphone push-notification apple-push-notifications


【解决方案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!';
            }

【讨论】:

    【解决方案2】:

    我发现你必须为每个 fwrite 创建一个新的 stream_context_create 以防止苹果关闭连接以获得错误的令牌。

    【讨论】:

    • 您可以在发送每个通知后简单地调用fread($socket):如果它返回FALSE,则重新创建套接字。您还可以将您的发送放入 try&catch 并自动重新创建套接字并重新发送通知(可能有最大重试次数,以防万一)。
    【解决方案3】:

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

        $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?

    【讨论】:

    • 感谢您的回复!!!很快就会看到回复。但是我已经解决了这些问题:(我需要描述如何将所有设备令牌发送到我的服务器以及如何发送它们单个连接中的通知。这对您来说似乎是一个非常基本的问题,但由于我是新手,所以我不知道如何做到这一点。请帮助
    • 谢谢 Priyank,我明白了你的逻辑,并且确信它会起作用,尽管我改变了编码语言。对吗?
    • 我建议您先尝试一下您喜欢的代码和情况。我是 Android 新手。
    • 嘿,我不是在为安卓问这个。我也是安卓新手
    • 我使用相同的代码,但我仍然只收到前两个设备的通知,而不是所有设备 [我在 7 个设备上发送通知]。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    相关资源
    最近更新 更多