Подтвердить что ты не робот

Отправка нескольких уведомлений о переносе iphone + APNS + PHP + Tutorial

Я работаю на php-сайте + приложение iphone и API для приложения iphone, имеет систему обмена сообщениями для студентов и врачей, когда кто-то отправляет сообщение (с веб-сайта или iphone), другой пользователь должен получить push-уведомление на своем iphone. Например, если ученик добавляет новый вопрос для учителя, то push-уведомление о преподавателях iphone/ipad будет отправлено учителю, и когда учитель ответит на ответ студента, студент получит push-уведомление. Поскольку нет ограничений на количество учителей и студентов, регистрирующихся на веб-сайте. Поэтому мой вопрос заключается в том, как отправлять push-сообщения зарегистрированным пользователям iphone, я хочу отправить push-сообщение сразу после ответа или добавить вопрос. Пожалуйста, предоставьте мне php-код для отправки нескольких push-сообщений. Я сохраняю токен устройства для каждого пользователя во время регистрации.

Когда учитель отвечает на вопрос, я отправляю почту ученику, я хочу отправить уведомление на push для ученика и наоборот, поэтому, пожалуйста, укажите код, способный управлять условиями ошибки.

Просьба предложить любой учебник для отправки push-уведомлений на iOS.

4b9b3361

Ответ 1

Вот как я это сделал наконец

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

Простой способ сделать это без использования какого-либо файла. Вы можете вызвать его несколько раз с помощью другого 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);

Ответ 3

Вам лучше использовать APNS-библиотеку для PHP. Здесь вы можете найти . Просмотрите образцы, которые предоставляют разработчики.

У меня также были проблемы с сертификатами. Мои действия:

  • найти файл ApnsPHP/Abstract.php
  • внесите некоторые изменения в метод _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);
    

    вместо оригинала, указанного там

  • теперь вы можете использовать сертификаты *.pem без необходимости entrust_root_certification_authority.

Это сработало для меня.