2016-04-14 1 views
1

Je cherche à créer APNS (Apple Push Notification Service), où le serveur enverra des notifications aux appareils iOS. Je suis en mesure de faire fonctionner les notifications push via PHP en utilisant le même jeton de périphérique et le même certificat. Cependant, je souhaite envoyer des notifications via Node JS au lieu de PHP.APNS (Apple Push Notification Service) avec le nœud JS

Je les fichiers valides/certificats pour me aider à démarrer:

  • cert.pem
  • key.pem
  • aps_development.cer
  • cert.p12
  • touche
  • . p12,
  • ck.pem

J'ai cherché à travers plusieurs ressources/liens tels que:

Après cela, j'ai pu trouver le code exemple suivant, où MOT DE PASSE signifie le mot de passe de l'key.pem et TOKEN signifie le jeton de mon appareil:

var apn = require("apn"); 
    var path = require('path'); 
    try { 
     var options = { 
      cert: path.join(__dirname, 'cert.pem'),   // Certificate file path 
      key: path.join(__dirname, 'key.pem'),   // Key file path 
      passphrase: '<PASSWORD>',        // A passphrase for the Key file 
      ca: path.join(__dirname, 'aps_development.cer'),// String or Buffer of CA data to use for the TLS connection 
      production:false, 
      gateway: 'gateway.sandbox.push.apple.com',  // gateway address 
      port: 2195,          // gateway port 
      enhanced: true         // enable enhanced format 
     }; 
     var apnConnection = new apn.Connection(options); 
     var myDevice = new apn.Device("<TOKEN>"); 
     var note = new apn.Notification(); 
     note.expiry = Math.floor(Date.now()/1000) + 3600; // Expires 1 hour from now. 
     note.badge = 3; 
     note.sound = "ping.aiff"; 
     note.alert = "You have a new message"; 
     note.payload = {'msgFrom': 'Alex'}; 
     note.device = myDevice; 
     apnConnection.pushNotification(note); 



     process.stdout.write("******* EXECUTED WITHOUT ERRORS************ :"); 


    } catch (ex) { 
     process.stdout.write("ERROR :"+ex); 
    } 

Je reçois aucune erreur lorsque execut Ce problème est dû au fait qu'aucune notification n'est reçue sur mon appareil iOS. J'ai également essayé de mettre en place le cal: null & debug: true (dans var options). Mais la même chose arrive.

Encore une fois, lorsque j'utilise le jeton de périphérique ck.pem & que j'ai et que je l'utilise avec PHP, cela fonctionne, mais je ne suis pas capable de le faire fonctionner dans Node JS. S'IL VOUS PLAÎT AIDE !!

Merci beaucoup!

Répondre

3

Vous utilisez probablement la nature asynchrone de NodeJS lui-même. J'utilise le même module node-apn avec beaucoup de succès. Mais vous ne l'appelez pas directement comme vous en avez l'habitude en PHP - c'est un modèle synchrone qui ne correspond pas à PHP-> Node. Votre processus est en cours de fermeture avant que quoi que ce soit puisse réellement se produire - le apnConnection.pushNotification(note); est un appel asynchrone qui commence à peine avant que votre script retourne/quitte.

Comme indiqué dans les documents node-apn, vous souhaitez probablement "écouter" des événements supplémentaires sur apnConnection. Voici un extrait de code que j'utilise pour vous déconnecter divers événements qui se produisent sur la connexion après sa création:

// We were unable to initialize the APN layer - most likely a cert issue. 
connection.on('error', function(error) { 
    console.error('APNS: Initialization error', error); 
}); 

// A submission action has completed. This just means the message was submitted, not actually delivered. 
connection.on('completed', function(a) { 
    console.log('APNS: Completed sending', a); 
}); 

// A message has been transmitted. 
connection.on('transmitted', function(notification, device) { 
    console.log('APNS: Successfully transmitted message'); 
}); 

// There was a problem sending a message. 
connection.on('transmissionError', function(errorCode, notification, device) { 
    var deviceToken = device.toString('hex').toUpperCase(); 

    if (errorCode === 8) { 
     console.log('APNS: Transmission error -- invalid token', errorCode, deviceToken); 
     // Do something with deviceToken here - delete it from the database? 
    } else { 
     console.error('APNS: Transmission error', errorCode, deviceToken); 
    } 
}); 

connection.on('connected', function() { 
    console.log('APNS: Connected'); 
}); 

connection.on('timeout', function() { 
    console.error('APNS: Connection timeout'); 
}); 

connection.on('disconnected', function() { 
    console.error('APNS: Lost connection'); 
}); 

connection.on('socketError', console.log); 

Tout aussi important, vous devez vous assurer que votre script SEJOURS RUNNING alors que les demandes async sont en cours de traitement. La plupart du temps, à mesure que vous construisez un service de plus en plus important, vous allez vous retrouver avec une sorte de boucle d'événement qui le fait, et des frameworks comme ActionHero, ExpressJS, Sails, etc. le feront pour vous.

En attendant, vous pouvez le confirmer avec cette boucle de super-brut, qui force le processus pour rester en cours d'exécution jusqu'à ce que vous frappez CTRL + C:

setInterval(function() { 
    console.log('Waiting for events...'); 
}, 5000); 
+0

Je vous remercie de votre réponse. Merci pour les clarifications, je comprends maintenant un peu plus à ce sujet. Pour tester, j'ai placé les événements dans setInterval comme indiqué. Malheureusement, quand je l'exécute, il renvoie les erreurs suivantes: ** si j'appelle "apnConnection.pushNotification (note);" alors 'transmissionError' est appelé et j'obtiens un code d'erreur 2 (qui manque le jeton de périphérique). ** Si j'appelle "apnConnection.pushNotification (note, myDevice);" Je reçois le message d'erreur suivant: [Erreur: connexion expiré] – galhe2

+1

Essayez de supprimer certaines de vos options inutiles, en particulier ca, passerelle, port et amélioré. Dans ma configuration, j'utilise seulement trois options: 'cert',' key', et 'production': true/false. J'ai suivi les instructions sur https://github.com/argon/node-apn/wiki/Preparing-Certificates pour préparer les fichiers cert et key. –

+0

D'accord, j'ai fait tout ce que vous avez dit. Je reçois des événements maintenant si je fais une erreur sur le but. La demande semble passer, mais je ne reçois aucune réponse. La seule chose que je reçois est: [Error: Connect a expiré] de l'événement 'transmissionError'. Après avoir regardé en ligne, j'ai constaté que les gens disent que c'est peut-être à cause d'un problème de réseau. J'ai donc appelé HostGator pour vérifier, mais ils ont déclaré que je ne devrais pas avoir de problèmes du tout. Avez-vous une idée de ce qui peut causer ce problème? Voici mon lien de référence: https://github.com/argon/node-apn/issues/327#issuecomment-152564768 – galhe2