2009-06-27 24 views
50

¿Hay algún proyecto de muestra que muestre cómo usar APNS en el iPhone y cómo configurarlo? Actualmente estoy mirando la documentación, pero sería bueno tener algún código de trabajo para separar y ver cómo funciona todo junto?Apple PNS (servicios de notificación de inserción) código de ejemplo

Parece que no puedo encontrar nada usando google o en el centro de desarrollo de iphone.

+2

Compruebe aquí http://arashnorouzi.wordpress.com/2011/03/31/sending-apple-push-notifications-in-asp-net-part-1/ es exactamente lo que está buscando. – Moon

+0

@ froh42 ¿Tiene algún código satisfactorio? También quiero un código de muestra para la implementación paso a paso. Si lo tiene, por favor proporciónémelo. Gracias de antemano. –

Respuesta

59

Lo peor de la configuración del servicio de notificación push es el aprovisionamiento. El principal obstáculo con el que me topé fue que hay un certificado y una clave en el archivo .cer que descargó del sitio de Apple, escribí un servicio de sistema en C# que enviaba notificaciones y las conexiones seguían fallando porque había exportado el certificado y no la clave

No recuerdo quién escribió originalmente esto, aquí hay un poco de código en python que me ayudó cuando estaba probando el servicio de notificación. Me gusta porque es muy simple y funciona bien durante las pruebas.

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

Hay también una joya carriles llamada apn_on_rails que parece funcionar bastante bien si está desarrollando una aplicación de rieles, acabo de ver hoy en día y fue capaz de enviar notificaciones desde la consola.

En el lado iPhone sólo tendrá que llamar al siguiente para registrar a todos los tipos de notificaciones:

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

Para recibir el token de dispositivo que necesita para implementar los siguientes métodos de delegado:

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error 

Durante la prueba, puede activar el dispositivo Token en la consola con NSLog, y luego pegarlo en la secuencia de comandos python, en producción obviamente tendrá que configurar algún método para obtener el token en sus servidores.

Además, en producción necesitará consultar el servicio de comentarios de Apple y eliminar los tokens de dispositivos de los usuarios que eliminaron su aplicación.

+1

Eche un vistazo a la respuesta de Simon a continuación: ha terminado el código de Python en una buena biblioteca que puede obtener aquí: http://github.com/simonwhitaker/PyAPNs –

+1

Para el registro, simplemente ejecuté este código con éxito. –

+1

ADVERTENCIA: este código es para la versión 0 del protocolo. Apple ahora tiene la versión 2. –

2

Mira en los foros en el centro de desarrollo de iPhone, supuestamente hay muchos ejemplos de código del lado del servidor para hablar con el servidor de inserción de Apple.

5

Realmente no hay mucho código para escribir en el lado del iPhone. Necesitas obtener el token único del iPhone o iPod Touch y luego retransmitir ese token a tu servidor. Obtener el token requiere una llamada a UIApplication, pero no hay una forma predefinida de obtenerlo en su servidor. Una de mis aplicaciones realiza un HTTP POST a un script PHP que coloca el token en una base de datos.

Si tiene curiosidad acerca del aprovisionamiento y la configuración de los certificados, etc., puede consultar la Guía de programación del Servicio de notificación de inserción de Apple.

+0

Ben, sí, no parece complicado de la documentación y también estoy seguro de que voy a trabajar en el aprovisionamiento (no he mirado eso, aún ...) Habría sido simplemente agradable dar un paso adelante. ejemplo paso a paso de cómo configurar cosas. – froh42

16

Un buen lugar para comenzar es Urban Airship. Puede configurar una cuenta básica gratuita que hará todo el trabajo del lado del servidor para enviar notificaciones automáticas a los servidores de Apple. También hacen un excelente trabajo al guiarlo a través de todos los pasos necesarios para que su aplicación funcione con su servicio, y tienen un excelente código de muestra que muestra cómo registrar su aplicación para notificaciones.

No tengo otra afiliación con ellos aparte de ser un usuario feliz de su servicio.

+0

Actualmente también voy por esta ruta, ya que la mayoría de los servidores compartidos no permiten la conexión a los puertos personalizados de Apple para las notificaciones automáticas. Recuerdo haber visto un programa de Python para Google App Engine antes de que envíe solicitudes de REST a Urban Airship (útil para notificaciones basadas en cron) pero parece que no puedo encontrarlo en este momento. Por favor, avíseme si se tropiezan con eso. ¡Gracias! –

+0

Sí, su servicio funciona bien. Se han expandido a un verdadero servicio de almacenamiento y reenvío llamado AirMail que quita la mayor parte del trabajo del back-end; todo lo que tiene que hacer ahora es enviar JSON con HTML incorporado a los servidores de Urban Airship; se encargan de enviar las notificaciones y servir el HTML cuando lo soliciten. –

+0

Hola, ¿pueden ayudarme por implementar la API de Urban Airship en mi aplicación de iPhone? ver qué problema estoy obteniendo es: http: // stackoverflow.com/questions/5634125/having-problem-with-empresairship-notification-iphone Espero que tenga alguna solución. gracias – Devang

3

Sé que era tarde, pero debería ver el proyecto MonoPush. Parece que proporcionarán una nueva forma de integración de inserción, así como estadísticas detalladas, incluidas estadísticas sobre el mapa.

14

En caso de que ayuda, he escrito una biblioteca de Python, PyAPNs, para interactuar con el servicio de notificaciones push en el lado del servidor:

http://github.com/simonwhitaker/PyAPNs

+0

Excelente, gracias Simon! –

4

Sé que esto es una pregunta muy antigua y tiene Recibí muchas respuestas, pero el tutorial de Rey Wenderlich me pareció muy útil y quería compartirlo con los principiantes de APNS. Es muy útil y muy fácil de entender.

Saludos,

Aditya

1

Aquí hay una versión de prueba de la prueba php5-guión de jessecurry. Utiliza el 'enhanced message format' e intenta capturar y mostrar los errores de Apple. Esto podría dar una indicación de lo que está mal con tus mensajes.

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

Pruebe el proyecto NWPusher en GitHub. Proporciona aplicaciones OS X e iOS para enviar notificaciones push manualmente, o puede utilizar la biblioteca Objective-C incluida directamente.

Cuestiones relacionadas