Symfony2 et APNS iOS

TerryTerry Membre
octobre 2013 modifié dans Langages Web & serveurs #1

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.


Réponses

  • muqaddarmuqaddar Administrateur

    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 ?


  • Mince B)


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


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

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


  • 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/richsage/RMSPushNotificationsBundle


     


    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.


  • 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


  • CéroceCéroce Membre, Modérateur
    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.
  • muqaddarmuqaddar Administrateur


    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.

  • LeChatNoirLeChatNoir Membre, Modérateur

    php, c'est très bien


Connectez-vous ou Inscrivez-vous pour répondre.