发送多个iPhone推送通知+ APNS + PHP

时间:2013-01-28 13:28:11

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

我正在开发一个PHP网站+ iPhone应用程序和iPhone应用程序的API,为学生和医生提供消息系统,当任何人发送消息(来自网站或iPhone)时,其他用户应该在他的iphone上获得推送通知。例如,如果学生为教师添加新问题,将向教师发送教师iPhone / iPad的推送通知,当教师回复学生的答案时,学生将收到推送通知。

由于对网站注册的教师和学生人数没有限制,我的问题是如何向注册用户的iPhone发送推送消息?我想在有人回复或添加问题时立即发送推送消息。请提供PHP代码以发送多个推送消息。 我在注册时为每个用户保存设备令牌。

当老师回复问题我正在向学生发送邮件时,我也想向学生发送推送通知,反之亦然,因此请指定能够管理错误情况的代码。

3 个答案:

答案 0 :(得分:34)

无需使用任何文件即可轻松完成此操作。您可以使用不同的tokeid多次调用它。

$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ckipad.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);

$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 amarnew: $err $errstr" . PHP_EOL);

//echo 'Connected to APNS' . PHP_EOL;

// Create the payload body
$body['aps'] = array(
    'badge' => +1,
    'alert' => $message,
    'sound' => 'default'
);

$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 'Message not delivered' . PHP_EOL;
else
    echo 'Message successfully delivered amar'.$message. PHP_EOL;

// Close the connection to the server
fclose($fp);

答案 1 :(得分:15)

您最好使用APNS库来安装PHP。你可以找到它here。查看开发人员提供的示例。

我的证书也有问题。我的行为是:

  1. 找到文件ApnsPHP/Abstract.php
  2. _connect()方法进行一些更改,粘贴此行

    $streamContext = stream_context_create(
                       array(
                         'ssl' => array(
                                   'local_cert' => $this->_sProviderCertificateFile,
                                   'passphrase' => ''
                                  )
                       )
    );
    
    $this->_hSocket = @stream_socket_client(
                        $sURL, 
                        $nError, 
                        $sError,
                        $this->_nConnectTimeout,
                        STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT,
                        $streamContext);
    

    而不是原来列在那里

  3. 现在您可以使用* .pem证书而无需委托_root_certification_authority。

  4. 这对我来说很好。

答案 2 :(得分:12)

这是我最终完成它的方式

  1. 已下载apns-php
  2. PHP代码
  3.     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!';
            }