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 :
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 <?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('ssl://gateway.push.apple.com:2195', $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); } ?>
Pour essayer de le faire fonctionner sous Symfony2 j'ai donc ajouté la ligne :
et remplacer cette ligne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 <?php $pathCk = $this->kernel->locateResource('@MonBundle/Notifications/ck.pem'); ?>
par celle-ci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 <?php stream_context_set_option($ctx, 'ssl', 'local_cert', './ck.pem'); ?>
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 <?php stream_context_set_option($ctx, 'ssl', 'local_cert', $pathCk); ?>
J'espère que vous m'avez compris et que vous pourrez m'aider à y voir un peu plus clair.
Merci d'avance.
Partager