Exemple de code Apple PNS (push notification services)
Existe-t-il un exemple de projet montrant comment utiliser APNS sur L'IPhone et comment configurer les choses? Je regarde actuellement la documentation mais ce serait bien d'avoir du code de travail à séparer et de voir comment tout cela fonctionne ensemble?
Je n'arrive pas à trouver quoi que ce soit en utilisant google ou dans le centre de développement de l'iphone.
10 réponses
Le pire dans la configuration du service de notification push est le provisionnement. La principale Pierre d'achoppement que je suis tombé sur était qu'il ya un certificat et une clé dans le .fichier cer que vous téléchargez à partir du site D'Apple, j'ai écrit un service système en C # qui a envoyé des notifications et les connexions ont continué à échouer parce que j'avais exporté le certificat et non la clé.
Je ne me souviens pas qui a écrit cela, voici un peu de code en python qui m'a aidé quand j'étais tout d'abord tester le service de notification. Je l'aime parce que c'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 une gemme rails appelée apn_on_rails qui semble fonctionner assez bien si vous développez une application rails, je l'ai vu aujourd'hui et j'ai pu envoyer des notifications depuis la console.
Du côté de l'iPhone, il vous suffit d'appeler ce qui suit pour vous inscrire à tous les types de notifications:
[[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert];
Pour recevoir le jeton de périphérique, vous devez implémentez les méthodes de délégué suivantes:
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
Pendant le test, vous pouvez simplement lancer le deviceToken sur la console avec NSLog, puis le coller dans le script python ci-dessus, en production, vous devrez évidemment configurer une méthode pour obtenir le jeton sur vos serveurs.
En outre, en production, vous devrez interroger le service de commentaires D'Apple et supprimer les jetons de périphérique des utilisateurs qui ont supprimé votre application.
Un bon point de départ est Urban Airship. Vous pouvez configurer un compte de base gratuit qui fera tout le travail côté serveur d'envoyer des notifications push aux serveurs D'Apple. Ils font également un excellent travail de vous guider à travers toutes les étapes nécessaires pour que votre application fonctionne avec leur service, et ont un excellent exemple de code qui montre comment enregistrer votre application pour les notifications.
Je n'ai pas d'autre affiliation avec eux que d'être un utilisateur heureux de leur service.
Au cas où cela aiderait, j'ai écrit une bibliothèque Python, PyAPNs, pour interagir avec le service de Notification Push Côté Serveur:
Celui-ci m'a beaucoup aidé à créer du code côté fournisseur sur un serveur linux avec PHP.
Il n'y a vraiment pas beaucoup de code à écrire du côté de l'iPhone. Vous devez obtenir le jeton unique de l'iPhone ou de l'iPod Touch, puis relayer ce jeton à votre serveur. Obtenir le jeton nécessite un appel à UIApplication mais il n'y a pas de moyen prédéfini d'obtenir cela sur votre serveur. Une de mes applications effectue un POST HTTP dans un script PHP qui place le jeton dans une base de données.
Si vous êtes curieux du provisionnement et de la configuration des certificats, etc..., vous pourriez vérifier la poussée D'Apple Guide De Programmation Du Service De Notification.
Je sais que c'est une question très ancienne et a reçu de nombreuses réponses, mais j'ai trouvé le tutoriel de Rey Wenderlich très utile et je voulais le partager pour les débutants APNS. Il est très utile et très facile à comprendre.
Regardez dans les forums dans le centre de développement de l'iPhone, soi-disant Il y a beaucoup d'exemples de code côté serveur pour parler au serveur push D'Apple.
Voici une version PHP5 Testée du script de test de jessecurry. Il utilise le ' enhanced message format', et tente d'attraper et d'afficher les erreurs d'apple. Cela pourrait donner une indication quant à ce qui ne va pas avec vos messages.
// Settings
$deviceToken = 'xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx';
$apnsCert = 'apns-dev.pem';
$apnsHost = 'gateway.sandbox.push.apple.com';
$apnsPort = 2195;
// Prepare payload
$payload =
array(
'aps' => array(
'alert' => 'Hi, this is an alert!',
'badge' => 8
)
);
$payload = json_encode($payload);
print($payload . "\n");
// Connect to Apple Push Notification server
$streamContext = stream_context_create();
stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);
$apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext);
if (!$apns) {
die('Error creating ssl socket');
}
// Don't block on reading from the socket
stream_set_blocking ($apns, 0);
// Send payload in enhanced message format ( http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingWIthAPS/CommunicatingWIthAPS.html#//apple_ref/doc/uid/TP40008194-CH101-SW1 )
$apnsMessage =
// Command "1"
chr(1)
// Identifier "88"
. pack('N', 88)
// Expiry "tomorrow"
. pack('N', time() + 86400)
// Token length
. chr(0) . chr(32)
// Device token
. pack('H*', str_replace(' ', '', $deviceToken))
// Payload length
. chr(0) . chr(strlen($payload))
// Actual payload
. $payload . $payload;
fwrite($apns, $apnsMessage);
// Pause for half a second to check if there were any errors during the last seconds of sending.
usleep(500000);
checkAppleErrorResponse($apns);
// Close connection -- apple would prefer that we keep
// a connection open and push data as needed.
fclose($apns);
function checkAppleErrorResponse($apns)
{
$responseBinary = fread($apns, 6);
if ($responseBinary !== false && strlen($responseBinary) == 6)
{
print(
"\n"
.'Error message recieved from Apple.'."\n"
.'For the meaning, refer to: "Provider Communication with Apple Push Notification Service"'."\n"
);
$response = unpack('Ccommand/Cstatus_code/Nidentifier', $responseBinary);
var_dump($response);
}
}