Utiliser Service de Notification Push Apple via Java
Suis en train de mettre en œuvre un programme Java qui envoie une Notification Push d'Apple pour un iPhone application client... Trouvé la bibliothèque suivante: Java APNs
Code fournisseur:
Créé le code suivant (à partir de Javapns) à utiliser dans mon application:
try {
PayLoad payLoad = new PayLoad();
payLoad.addAlert("My alert message");
payLoad.addBadge(45);
payLoad.addSound("default");
PushNotificationManager pushManager = PushNotificationManager.getInstance();
pushManager.addDevice("iPhone", "f4201f5d8278fe39545349d0868a24a3b60ed732");
log.warn("Initializing connectiong with APNS...");
//Connect to APNs
pushManager.initializeConnection(HOST, PORT,
"/etc/Certificates.p12", "password",
SSLConnectionHelper.KEYSTORE_TYPE_PKCS12);
Device client = pushManager.getDevice("Lambo");
//Send Push
log.warn("Sending push notification...");
PushNotificationManager.getInstance().sendNotification(client, payLoad);
}
catch (Exception e) {
throw new ApnsPushNotificationException("Unable to send push " + e);
}
Quand je lance cette application (que vous pouvez voir à travers la Log4j consolidés) il n'y a pas d'exceptions qui se produisent:
WARN [MyCode] Initializing connectiong with APNS...
WARN [MyCode] Sending push notification...
Mais mon application client ne reçoit pas de notifications!
IDPP Processus d'Inscription:
Aussi, fait le suivre sur le Portail iPhone Developer Program (IDPP):
- Créé l'APN en fonction SSL Certificat et les Clés
- Créé et installé le profil de configuration
- Installé le Certificat SSL et la Clé sur le serveur.
Avoir lu en entier le Service de Notification Push Apple Guide à plusieurs reprises et a remarqué quelques choses:
(1) À la page 15, il précise que le dispositif de jeton n'est pas le même que le dispositif UDID (dont je suis actuellement transmet de façon incorrecte en tant que second paramètre à l'intérieur de la PushNotificationManager.addDevice (), méthode (voir ci-dessus)).
À la page 17, il est dit:
"APNs génère un dispositif de jeton en utilisant les informations contenues dans le dispositif unique de certificat. Le dispositif de jeton contient un identifiant de l'appareil. Il crypte le dispositif de jeton avec un jeton de clé et le renvoie à l'appareil. L'appareil retourne l'appareil jeton à la demande comme un NSData objet. L'application doit alors livrer le dispositif de jeton à son fournisseur en binaire ou en hexadécimal de format."
iPhone OS Client de la mise en Œuvre
(2) Après la lecture de pages 33 - 34, j'ai découvert que je ne comprend pas le code Objective-C pour l'application de registre avec un Apn.
Ne suis pas un Objectif-développeur C, donc est-ce là où je peux récupérer le code de l'appareil ou dois-je l'obtenir à partir de ce certificat?
Où puis-je obtenir le dispositif de jeton (désolé, quelqu'un d'autre a écrit l'Objective-C application cliente et je suis un Développeur Java)?
Question(s):
(1) À l'exception de ne pas savoir où obtenir de l'appareil jeton et le client mobile code d'enregistrement, est-il autre chose que je n'ai pas regardé plus ou raté?
(2) Suis-je à l'aide de la Javapns de la bibliothèque de la bonne façon?
Merci d'avoir pris le temps de lire ceci...
OriginalL'auteur mw_javaguy | 2009-08-31
Vous devez vous connecter pour publier un commentaire.
Juste un petit conseil, afin de convertir votre reçu un jeton dans un format approprié pour l'enregistrement avec javapns, ce code fera l'affaire:
}
OriginalL'auteur ZaBlanc
Comme un honteux de l'auto-publicité, je vous encourage à utiliser
java-apns
de la bibliothèque. Votre code ressemblera à:c'est correct, je n'ai pas décroché.
Ok, très bien. J'ai été en mesure d'obtenir le code exact que vous avez collé au-dessus de travail, tant que j'ai remplacé deviceToken avec la pleine 64 char hex chaîne générée par le code similaire à ZaBlanc. Grande bibliothèque, par le moyen!
Merci, merci de rejoindre le groupe de google et de l'influence de la bibliothèque de l'évolution.
Le code ci-dessus est très bien pour une seule charge utile de pousser à un ou plusieurs périphériques. Si nous devons le faire à plusieurs reprises basé sur l'appel de service web, de la création de la apnsservice à chaque fois ne sera pas bonne. Est-il un moyen de garder cette connexion ouverte aussi longtemps que possible? Je ne vois pas d'ouvrir ou de fermer de connexion. quand a-t-il se passer exactement. Merci de me guider.
OriginalL'auteur notnoop
Votre code Java semble solide! Cependant, n'oubliez pas de fermer la connexion, par le biais de
PushNotificationManager.closeConnection()
. Il est important de nettoyer après vous.Comme un autre commentaire, je remarque que vous êtes l'ajout de l'appareil "iPhone", mais interrogation de "Lambo" par la suite. Ceci est une indication d'un bug.
L'appareil jeton indiqué dans le code est incorrect. Dispositif de jetons, actuellement, sur 32 bits, la valeur de type long, qui obtient un maléfice à 64 caractères. Je suppose que le serveur est en échec silencieux lorsque l'on pousse la notification à invalid token!
La seule façon d'obtenir le dispositif de jeton est à partir de l'application elle-même. Comme prévu par le Notification Push guide l'indique, l'application iPhone a besoin de s'inscrire pour la notification lors du lancement. Dans le
application:didRegisterForRemoteNotificationswithdevicetoken:
, l'iPhone doit envoyer l'appareil jeton à votre java serveur du fournisseur. (À des fins de débogage, vous pouvez simplementNSLog
l'appareil symbolique et de l'utiliser; il ne change jamais à travers les pistes).Je vous recommande de créer un serveur en java serveur de fournisseur de dispositif de réception des jetons. Configurer un
ServerSocket
à recevoir des connexions à partir de l'iPhone et de leur dispositif de jeton (et toutes les autres informations dont vous avez besoin) et insérez-les jetons dans la base de données.OriginalL'auteur notnoop
J'ai essayé et je reçois pendu lors de l'envoi de la notification, et rien n'est envoyé.
Le problème découle de la fonction suivante:
Il semble que le bufferedreader a NULL
Ainsi, lorsque cette portion de code est touché, il se contente d'être là en boucle sans fin
Cette sortie est [null]
Donc, puis à droite après la boucle est exécutée:
Le code entre dans la première boucle while et attend le BufferedReader pour être prêt
et ne cesse d'attente..... annonce qui est votre pendaison
OriginalL'auteur sergio
JavaPNS a été récemment mis à jour en 2.0, et la correction de TOUS les problèmes signalés jusqu'à la date de sortie. Il n'résoudre le problème que vous décrivez, et à l'aide de la bibliothèque est BEAUCOUP plus simple qu'il ne l'a jamais été (vous pouvez pousser une notification avec une seule ligne de code).
Ici, il est: Push.alert("Hello World!", "fichier de clés.p12", "keystore_password", false, "pion"); le Tout est assez bien documentée dans le wiki du projet sur Google Code. Il y a de base et avancées des exemples de code.
OriginalL'auteur Sylvain P.
Vous semblent manquer le jeton
L'id et un jeton de vérification:
https://github.com/o-sam-o/javapns/blob/master/src/javapns/notification/PushNotificationManager.java#L501
La seule façon d'obtenir un jeton est à partir de l'application iphone. Un jeton valide ressemble à quelque chose comme ceci:
1d2d6f34 c5028bca c50df5f9 1992c912 ce7deae8 3bbe7da5 447f6a68 cfecdc0e
OriginalL'auteur Sam