Pregunta

¿Hay un proyecto de muestra que muestre cómo usar APNS en el iPhone y cómo configurar las cosas? Actualmente estoy viendo la documentación, pero sería bueno tener un código de trabajo para separar y ver cómo funciona todo junto.

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

¿Fue útil?

Solución

La peor parte de la configuración del servicio de notificaciones push es el aprovisionamiento. El principal obstáculo que encontré fue que hay un certificado y una clave en el archivo .cer que descargas del sitio de Apple, escribí un servicio del 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ó esto originalmente, aquí hay un pequeño código en Python que me ayudó cuando probé por primera vez 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()

También hay una gema de rieles llamada apn_on_rails que parece funcionar bastante bien si estás desarrollando una aplicación de rieles, la acabo de ver hoy y pude enviar notificaciones desde la consola.

En el lado del iPhone, solo deberá llamar a los siguientes para registrarse para todo tipo de notificaciones:

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

Para recibir el token del dispositivo, deberá implementar los siguientes métodos de delegado:

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

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

Durante las pruebas, puede simplemente patear el dispositivo Tomado a la consola con NSLog, luego pegarlo en el script de Python anterior, en producción obviamente necesitará configurar algún método para llevar el token a sus servidores.

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

Otros consejos

Un buen lugar para comenzar es Urban Airship . Puede configurar una cuenta básica gratuita que hará todo el trabajo del lado del servidor de enviar notificaciones push a los servidores de Apple. También hacen un gran trabajo al guiarlo por 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 recibir notificaciones.

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

En caso de que ayude, he escrito una biblioteca de Python, PyAPN, para interactuar con el Servicio de notificaciones push en el lado del servidor:

http://github.com/simonwhitaker/PyAPNs

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

Este me ayudó mucho a crear código del lado del proveedor en el servidor Linux con PHP.

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

Si tiene curiosidad sobre el aprovisionamiento y la configuración de los certificados, etc., puede consultar la Guía de programación del servicio de notificaciones push de Apple.

Sé que esta es una pregunta muy antigua y ha recibido muchas respuestas, pero encontré el tutorial de Rey Wenderlich muy útil y quería compartirlo para principiantes de APNS. Es muy útil y muy fácil de entender.

Sé que fue 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.

Mire 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 push de Apple.

Aquí hay una versión php5 probada del script de prueba de jessecurry. Utiliza el ' formato de mensaje mejorado 'e intenta detectar y mostrar errores de Apple. Esto podría dar una indicación de lo que está mal con sus 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);
    }
}

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top