Apple PNS (Push-Benachrichtigungsdienste) Beispielcode

Gibt es ein Beispielprojekt, das zeigt, wie man APNS auf dem IPhone benutzt und wie man Dinge einrichtet? Ich schaue mir gerade die Dokumentation an, aber es wäre schön, ein paar funktionierende Codes zu haben, um sie auseinander zu nehmen und zu sehen, wie alles zusammen funktioniert.

Ich kann nicht scheinen, irgendetwas mit Google oder im iphone dev Zentrum zu finden.

   

Der schlimmste Teil bei der Einrichtung des Push-Benachrichtigungsdienstes ist die Bereitstellung. Der Hauptstolperstein, auf den ich stieß, war, dass es ein Zertifikat und einen Schlüssel in der CER-Datei gibt, die Sie von der Apple-Website herunterladen. Ich schrieb einen Systemdienst in C #, der Benachrichtigungen verschickte und die Verbindungen scheiterten, weil ich das Zertifikat exportiert hatte und nicht der Schlüssel.

Ich kann mich nicht erinnern, wer das ursprünglich geschrieben hat, hier ist ein bisschen Code in Python, der mir geholfen hat, als ich den Benachrichtigungsdienst zum ersten Mal getestet habe. Ich mag es, weil es sehr einfach ist und beim Testen gut funktioniert.

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() 

Es gibt auch ein Rails-Juwel namens apn_on_rails, das ziemlich gut funktioniert, wenn Sie eine Rails-Anwendung entwickeln. Ich habe es gerade gesehen und konnte Benachrichtigungen von der Konsole aus senden.

Auf der iPhone-Seite müssen Sie nur Folgendes aufrufen, um sich für alle Arten von Benachrichtigungen zu registrieren:

 [[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert]; 

Um das Geräte-Token zu erhalten, müssen Sie die folgenden Delegate-Methoden implementieren:

 - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error 

Während des Tests können Sie das deviceToken einfach mit NSLog auf die Konsole kicken und dann in das obige Python-Skript einfügen. In der Produktion müssen Sie natürlich eine Methode einrichten, um das Token auf Ihre Server zu bekommen.

Außerdem müssen Sie in der Produktion den Feedback-Service von Apple abfragen und Geräte-Token von Nutzern entfernen, die Ihre App entfernt haben.

Ein guter Ausgangspunkt ist Urban Airship . Sie können ein kostenloses Basiskonto einrichten, das alle serverseitigen Aufgaben zum Senden von Push-Benachrichtigungen an Apple-Server übernimmt. Sie sind auch sehr gut darin, Sie durch alle Schritte zu führen, die erforderlich sind, damit Ihre Anwendung mit ihrem Dienst funktioniert, und haben einen ausgezeichneten Beispielcode, der zeigt, wie Sie Ihre Anwendung für Benachrichtigungen registrieren.

Ich habe keine andere Zugehörigkeit zu ihnen, als dass ich ein glücklicher Nutzer ihres Dienstes bin.

Falls es hilft, habe ich eine Python-Bibliothek, PyAPNs, für die Interaktion mit dem Push Notification Service auf der Serverseite geschrieben:

http://github.com/simonwhitaker/PyAPNs

http://blog.boxedice.com/2009/07/10/how-to-build-an-apple-push-notification-provider-server-tutorial/

Dieser hat mir sehr dabei geholfen, Provider Code auf Linux Server mit PHP zu erstellen.

Es gibt wirklich nicht viel Code, um auf der iPhone Seite zu schreiben. Sie müssen das eindeutige Token des iPhone oder iPod Touch erhalten und dieses Token dann an Ihren Server weiterleiten. Das Abrufen des Tokens erfordert einen Aufruf von UIApplication, aber es gibt keine vordefinierte Möglichkeit, diese auf Ihren Server zu bekommen. Eine meiner Apps führt einen HTTP POST zu einem PHP-Skript aus, das das Token in eine database einfügt.

Wenn Sie sich für die Bereitstellung und das Einrichten von Zertifikaten usw. interessieren, lesen Sie den Programmierungsleitfaden für den Apple Push Notification Service.

Ich weiß, das ist eine sehr alte Frage und hat viele Antworten erhalten, aber ich fand das Tutorial von Rey Wenderlich sehr nützlich und wollte es für APNS-Anfänger teilen. Es ist sehr nützlich und sehr einfach zu verstehen.

Ich weiß, dass es spät war, aber du solltest das MonoPush- Projekt sehen. Es scheint, dass sie eine neue Art der Push-Integration sowie detaillierte Statistiken, einschließlich Statistiken über die Karte bieten werden.

Schauen Sie in den Foren im iPhone-Entwicklungscenter nach, angeblich gibt es eine Menge Beispiele für serverseitigen Code, um mit dem Push-Server von Apple zu kommunizieren.

Hier ist eine getestete php5-Version von jessecurrys Test-Skript. Es verwendet das ” erweiterte Nachrichtenformat ” und versucht, Fehler von Apple abzufangen und anzuzeigen. Dies könnte einen Hinweis darauf geben, was mit Ihren Nachrichten nicht stimmt.

 // 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); } } 

Versuchen Sie das NWPusher- Projekt auf GitHub. Es bietet OS X- und iOS-Apps, um Push-Benachrichtigungen manuell zu senden, oder Sie können die enthaltene Objective-C-Bibliothek direkt verwenden.