Le pire, sur la configuration du service de notification push est la mise en service. Le plus grand obstacle que j'ai rencontré a été que, il y a un certificat et une clé dans le .cer fichier que vous téléchargez depuis le site d'Apple, j'ai écrit un système de service en C# qui a envoyé les notifications et les connexions continué à échouer parce que j'avais exporté le certificat et non pas la clé.
Je ne me souviens pas qui a écrit cela, voici un peu de code en python qui m'a aidé lorsque j'ai commencé à tester le service de notification. Je l'aime parce qu'il est très simple et fonctionne bien pendant les tests.
import socket, ssl, json, struct
# device token returned when the iPhone application
# registers to receive alerts
deviceToken = 'XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX'
thePayLoad = {
'aps': {
'alert':'Oh no! Server\'s Down!',
'sound':'k1DiveAlarm.caf',
'badge':42,
},
'test_data': { 'foo': 'bar' },
}
# Certificate issued by apple and converted to .pem format with openSSL
# Per Apple's Push Notification Guide (end of chapter 3), first export the cert in p12 format
# openssl pkcs12 -in cert.p12 -out cert.pem -nodes
# when prompted "Enter Import Password:" hit return
#
theCertfile = 'cert.pem'
#
theHost = ( 'gateway.sandbox.push.apple.com', 2195 )
#
data = json.dumps( thePayLoad )
# Clear out spaces in the device token and convert to hex
deviceToken = deviceToken.replace(' ','')
byteToken = bytes.fromhex( deviceToken ) # Python 3
# byteToken = deviceToken.decode('hex') # Python 2
theFormat = '!BH32sH%ds' % len(data)
theNotification = struct.pack( theFormat, 0, 32, byteToken, len(data), data )
# Create our connection using the certfile saved locally
ssl_sock = ssl.wrap_socket( socket.socket( socket.AF_INET, socket.SOCK_STREAM ), certfile = theCertfile )
ssl_sock.connect( theHost )
# Write out our data
ssl_sock.write( theNotification )
# Close the connection -- apple would prefer that we keep
# a connection open and push data as needed.
ssl_sock.close()
Il y a aussi un gem rails appelé apn_on_rails qui semble fonctionner assez bien si vous êtes en développement d'une application rails, je viens de voir ça aujourd'hui et a été en mesure d'envoyer des notifications à partir de la console.
Sur iPhone vous avez juste besoin d'appeler le suivant pour vous inscrire pour tous les types de notifications:
[[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert];
Pour recevoir le dispositif de jeton que vous aurez besoin de mettre en œuvre le délégué suivant les méthodes:
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
Pendant le test, vous pouvez simplement frapper le deviceToken à la console avec NSLog, puis la coller dans le script python ci-dessus, en production, vous aurez évidemment besoin de mettre en place une méthode pour récupérer le jeton de vos serveurs.
Aussi, dans la production, vous aurez besoin de la requête d'Apple service de rétroaction et de supprimer le périphérique jetons les utilisateurs qui l'ont supprimé de votre application.