Envoi de plusieurs notifications push iphone + APNS + PHP + tutoriel

je travaille sur un site web php + application iphone et API pour application iphone, dispose d'un système de messagerie pour les étudiants et les médecins, lorsque quelqu'un envoie un message(à partir du site web ou iphone) l'autre utilisateur devrait obtenir notification push sur son iphone. Par exemple, si l'élève ajoute une nouvelle question à l'enseignant, une notification push sur l'iphone/ipad de l'enseignant sera envoyée à l'enseignant et lorsque l'enseignant répondra à la réponse de l'élève, l'élève recevra une notification push. Puisqu'il n'y a pas de restriction sur nombre d'enseignants et d'élèves inscrits sur le site web. Donc ma question est comment faire pour envoyer des messages push aux utilisateurs enregistrés iphone, je souhaite envoyer un message push dès qu'une réponse ou d'ajouter une question. Merci de me fournir le code php pour l'envoi de plusieurs messages push. J'enregistre le token de périphérique pour chaque utilisateur lors de l'enregistrement.

quand l'enseignant répond à la question j'envoie le courrier à l'étudiant, je veux envoyer une notification push trop à l'étudiant et vice versa donc s'il Vous Plaît spécifier le code capable de gérer les conditions d'erreur.

s'il vous plaît suggérer n'importe quel tutoriel pour envoyer des notifications push sur iOS.

26
demandé sur Subodh Ghulaxe 2013-01-28 17:28:11

4 réponses

manière Simple de le faire sans utiliser de fichier. Vous pouvez l'appeler plusieurs fois avec différents 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);
34
répondu Amar Banerjee 2013-07-05 05:27:33

vous devriez mieux utiliser la bibliothèque APNS pour PHP. Vous pouvez le trouver ici . Examinez les échantillons fournis par les développeurs.

j'ai aussi eu des problèmes avec les certificats. Mes actions ont été:

  1. rechercher le fichier ApnsPHP/Abstract.php
  2. apporter quelques changements à _connect() méthode, coller cette ligne

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

    au lieu de l'original indiqué là

  3. maintenant, vous pouvez utiliser *.pem certificats sans besoin de entrust_root_certification_authority.

Cela a bien fonctionné pour moi.

15
répondu Gino Pane 2014-08-28 14:47:49

C'est la façon dont je l'ai fait enfin

  1. téléchargé apns-php
  2. code 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!';
        }
12
répondu Subodh Ghulaxe 2013-09-27 11:03:47

C'est un très bon tutoriel sur tout cela. M'a aidé à configurer mon serveur et mon application de démonstration http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios-6-tutorial-part-1

2
répondu user1176590 2014-02-23 04:00:10