Aller au contenu


Photo

Symfony2 et APNS iOS


  • Please log in to reply
9 réponses à ce sujet

#1 Terry

Terry

    Eleveur de cacaoyers

  • Membre
  • PipPip
  • 20 messages

Posté 02 octobre 2013 - 08:36

Bonjour amis développeurs,

J'ai développé une application web sous Symfony2 qui intègre une API permettant l’interaction avec une de mes applications mobiles sur iOS.
Pour faire simple, mon application web doit envoyer tous les jours des notifications push via le service APNS d'Apple sur l'application mobile.
Pour cela, j'utilise la fonction suivante :

 
<?php 
 
function sendNotification($message, $numBadge, $deviceTokenList)
{
	$body = array();
        $body['aps'] = array();
        $body['aps']['alert'] = $message;
        $body['aps']['badge'] = $numBadge;
        $body['aps']['sound'] = "default";
        $payload = json_encode($body);
 
        // Le jeton du terminal
        $deviceToken = "";
 
        // Création d'un contexte SSL
        $ctx = stream_context_create();
 
        // Ouverture du fichier PEM contenant clé privé et certificat
        $pathCk = $this->kernel->locateResource('@MonBundle/Notifications/ck.pem');
        stream_context_set_option($ctx, 'ssl', 'local_cert', $pathCk);
 
        // Ouverture d'une connexion réseau vers les serveurs de développement Apple
        $fp = stream_socket_client('',
        $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
 
        if(!$fp) {
            print "Erreur de connexion: $err $errstr\n";
        }
        else {
            print "Connection OK\n";
        }
 
        // Pour chaque device inscrit
        foreach($deviceTokenList as $deviceToken)
        {
            // Construction des données à envoyer
            $msg = chr(0) . pack('n', 32)
            . pack('H*', str_replace(' ', '', $deviceToken))
            . pack('n', strlen($payload)) . $payload;
 
            print "Message: " . $payload . "\n";
 
            // Envoie des données
            $result = fwrite($fp, $msg, strlen($msg));
 
            if (!$result){
            echo '<p>The message has not been sent '. PHP_EOL;
 
            }
            else{
            echo '<p>The message has been sent ' . PHP_EOL;
 
            }
        }
 
        // Fermeture de la connexion
        fclose($fp);
}
 
?>

NOTE : Dans la fonction stream_socket_client je n'ai pas mis ssl: // gateway . push . apple . com : 2195 dans l'extrait de code (j'ai mis '' à la place) car cela ne me l'affiché pas sinon (beug de cocoacafe ?) mais l'adresse est BIEN PRESENTE en réalité.

 

Cette fonction MARCHE sans Symfony2 car avant de migrer sous ce Framework le système de notifications était intégré dans une autre application web.
Pour essayer de le faire fonctionner sous Symfony2 j'ai donc ajouté la ligne :

 
<?php
        $pathCk = $this->kernel->locateResource('@MonBundle/Notifications/ck.pem');
?>

et remplacer cette ligne :

 
<?php
    stream_context_set_option($ctx, 'ssl', 'local_cert', './ck.pem');
?>

par celle-ci :

 
<?php
    stream_context_set_option($ctx, 'ssl', 'local_cert', $pathCk);
?>

Le problème se trouve donc au niveau de l'ouverture et de la transmission du certificat ck.pem au service d'Apple: soit il est mal ouvert, soit pas du tout.


J'espère que vous m'avez compris et que vous pourrez m'aider à y voir un peu plus clair.
Merci d'avance.



#2 muqaddar

muqaddar

    Mouleur de chocolats

  • Maître Chocolatier
  • 10 888 messages

Posté 02 octobre 2013 - 13:31

Pas sûr qu'il y est des adeptes de Symfony sur ce forum...

Tu as essayé de plutôt voir sur les forums de Symfony ?


Mes applications iOS: VinoCell

#3 Terry

Terry

    Eleveur de cacaoyers

  • Membre
  • PipPip
  • 20 messages

Posté 02 octobre 2013 - 19:44

Mince :crazy:

Oui déjà mais je vais continuer du coup ...



#4 FKDEV

FKDEV

    Broyeur de fèves

  • Artisan chocolatier
  • PipPipPipPipPipPip
  • 1 660 messages

Posté 02 octobre 2013 - 20:29

Le .pem n'est pas envoyé au serveur d'Apple mais son contenu est utilisé pour établir une connection SSL avec les serveurs d'Apple.

Je ne connais pas bien Symfony2, ni le php mais il doit y avoir un moyen de vérifier que pathCk contient bien un chemin valide et accessible par le compte utilisateur qui execute le php. 

Essaye de logger le contenu des erreurs renvoyées par stream_socket_client.

 

 

Autre piste : un fichier .pem peut être protégé par un mot de passe. Si c'est le cas je ne vois pas la référence au mot de passe dans ton code.

 

Dernière piste : le code que tu montres ressemble au code de easyAPNS, essaye de faire des rapprochements entre les deux codes pour mieux situer où ça coince.



#5 Terry

Terry

    Eleveur de cacaoyers

  • Membre
  • PipPip
  • 20 messages

Posté 02 octobre 2013 - 20:54

Merci pour ces indications FKDEV,

 

Je pense qu'effectivement c'est un problème d'accessibilité au niveau du fichier ck.pem, concernant le chemin, il est bien valide.

Au sujet du mot de passe il n'y en a pas car comme je l'ai mentionné, ce code marchait hors framework Symfony2.



#6 Magiic

Magiic

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 344 messages
  • LocationParis

Posté 28 février 2015 - 14:35

J'arrive un peu tard mais moi lorsque j'envois des notifications par le biais d'une plateforme web sous Symfony 2 j'utilise le bundle qui se trouve à cette adresse :

 

https://github.com/r...ficationsBundle

 

Ce qui est bien avec c'est qu'il gère iOS mais aussi android et windows. Il s'occupe de tout faire ou presque pour nous. Il suffit juste après de créer la vue et le fichier pem qu'on doit intégrer dans le projet.

 

Ça peut toujours servir.



#7 polaroid62

polaroid62

    Eleveur de cacaoyers

  • Membre
  • PipPip
  • 28 messages

Posté 22 mars 2015 - 20:59

J'ai jamais fait de symfony  , il parait que c'est pas trop mal même si ça reste du PHP  >:(  Dommage qu'Apple ne nous sorte pas un framework web basé sur Swift



#8 Céroce

Céroce

    Mouleur de chocolats

  • Contrôleur d'arômes
  • 5 206 messages
  • LocationSaint-Leu-d'Esserent / France

Posté 23 mars 2015 - 09:09

Ouais, une framework web faite par Apple, en source fermé, avec une mise à jour par an, et abandonnée au bout de deux ans, c'est un peu mon rêve.
  • muqaddar aime ceci
RenaudPradenc.com Je suis développeur iOS & Mac indépendant.

#9 muqaddar

muqaddar

    Mouleur de chocolats

  • Maître Chocolatier
  • 10 888 messages

Posté 23 mars 2015 - 09:34

J'ai jamais fait de symfony  , il parait que c'est pas trop mal même si ça reste du PHP  >:(  Dommage qu'Apple ne nous sorte pas un framework web basé sur Swift

 

Swift sera p-e un jour un langage web, qui sait.


Mes applications iOS: VinoCell

#10 LeChatNoir

LeChatNoir

    Brasseur de pâte à cacao

  • Artisan chocolatier
  • PipPipPipPipPipPipPip
  • 3 131 messages
  • LocationLyon

Posté 23 mars 2015 - 15:03

php, c'est très bien


Le Chat Noir, développeur à ses heures...
Application passion => ClimbingAway





0 utilisateur(s) li(sen)t ce sujet

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)