usernotification development desarrollador apple app ios ios8 apple-push-notifications ios-frameworks

ios - development - usernotification



Implemente PushKit y pruebe el comportamiento de desarrollo (3)

Debe habilitar también las notificaciones remotas, incluso si no las usa:

  • dentro de su identificador de ID de aplicación en el portal para desarrolladores
  • recrear los perfiles de aprovisionamiento de desarrollo
  • presione Descargar todo en XCode -> Preferencias ... -> Cuentas -> su cuenta
  • habilitar notificaciones remotas en capacidades -> modos de fondo

Hecho esto, recibirá la devolución de llamada delegada tanto en Debug como en Release.

Me gustaría implementar el servicio PushKit dentro de mi aplicación (aplicación Voip), pero tengo la siguiente duda: veo que solo puedo generar un certificado voip de producción, ¿funciona si intento probar el servicio de notificación push voip en el dispositivo desarrollado?

Esta es mi prueba de implementación:

Con esta línea de 3 códigos puedo obtener el token push en la devolución de llamada didUpdatePushCredentials que uso para guardar en mi servidor.

PKPushRegistry *pushRegistry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()]; pushRegistry.delegate = self; pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];

Del lado del servidor, genero una notificación push de carga útil "normal" con solo texto de alerta, y la envié a un token de VoIP almacenado en mi servidor.

Uso la devolución de llamada con el registro de depuración, ¡pero nunca me llaman!

- (void)pushRegistry:(PKPushRegistry *)registry didInvalidatePushTokenForType:(NSString *)type { NSLog(@"didInvalidatePushTokenForType"); } -(void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(NSString *)type { NSLog(@"didReceiveIncomingPushWithPayload: %@", payload.description); } -(void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(NSString *)type { if([credentials.token length] == 0) { NSLog(@"voip token NULL"); return; } NSLog(@"didUpdatePushCredentials: %@ - Type: %@", credentials.token, type); }

Si intento generar un mensaje de notificación de inserción de mi servidor para anular el token del dispositivo cargado previamente, nunca recibo una notificación de devolución de llamada didReceiveIncomingPushWithPayload, pero del servidor recibo un mensaje de 200 ok (el mensaje se envió correctamente)


En caso de que alguien esté interesado en probar las notificaciones push de VoIP con Pushkit aquí, dejé un pequeño procedimiento que seguí con éxito:

1 - Cree, si aún no lo tiene, una CSR con acceso a llavero y guarde su CSR localmente.

2 - Vaya al desarrollador de Apple y obtenga acceso a certificados, identificadores y perfiles. En el centro de miembros.

  • Identificadores internos-> ID de aplicaciones Crear una nueva ID de aplicación
  • Dispositivos internos-> Todos Agregar dispositivos UDID que desea usar para probar los empujes de voip
  • Certificados internos-> Todos Cree un nuevo certificado de producción: Certificado de servicios VoIP. Seleccione el ID de la aplicación creada anteriormente para su Certificado de servicio de VoIP. Seleccione CSR (Solicitud de firma de certificado) creada anteriormente y una vez creada, descargue su nuevo voip_services.cer

Una vez descargado, haga doble clic en voip_services.cer para abrir la aplicación Keychain Access y exportar la clave privada para el certificado generado: botón derecho Exportar archivo certificate.p12 .

Guarde el archivo voip_services.cer y certificate.p12 en una carpeta para crear su generador de notificaciones push del servidor

Finalmente, vaya nuevamente al sitio web de Apple Developer y dentro de Provisioning Profiles-> Distribution cree un nuevo perfil de distribución Ad-Hoc que incluya en él todos los dispositivos UDID que desee usar para probar los empujes de voip. Descargue este perfil y arrástrelo y suéltelo en su xcode para usarlo en su aplicación.

Ahora creemos la aplicación iOS que recibirá notificaciones push de VoIP:

  • Cree una nueva aplicación de vista única desde el nuevo menú del proyecto Xcode.
  • Complete su Identificador de paquete de acuerdo con la identificación de la aplicación creada en la sección anterior.
  • Agregue PushKit.framework en General-> Marcos vinculados y bibliotecas.
  • En Capacidades, active el Modo de fondo y seleccione la opción Voz sobre IP.
  • En Configuración de compilación -> Firma de código, seleccione el perfil de aprovisionamiento que descargó anteriormente y seleccione Distribución como Identidad de firma de código.

Agreguemos a la aplicación el código que Pasquale agregó en su pregunta:

En el encabezado del controlador de vista raíz ( ViewController.h ) una importación para PushKit.framework:

#import <PushKit/PushKit.h>

Agregue delegado para implementar sus funciones:

@interface ViewController : UIViewController <PKPushRegistryDelegate>

Agregue la función viewDidLoad de su registro de inserción del controlador de vista raíz (ViewController.m):

- (void)viewDidLoad { [super viewDidLoad]; PKPushRegistry *pushRegistry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()]; pushRegistry.delegate = self; pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP]; }

Implemente las funciones delegadas requeridas:

- (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(NSString *)type{ if([credentials.token length] == 0) { NSLog(@"voip token NULL"); return; } NSLog(@"PushCredentials: %@", credentials.token); } - (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(NSString *)type { NSLog(@"didReceiveIncomingPushWithPayload"); }

Una vez que todo se está compilando y está bien, archive su proyecto y exporte su archivo ipa para instalarlo en dispositivos de prueba (puede usar, por ejemplo, Testflight para hacer el trabajo).

Ejecútelo y obtenga de los registros las PushCredentials que usaremos para enviar notificaciones.

Ahora vamos al lado del servidor (seguí esta gran guía de tutoriales de raywenderlich ):

Regrese a la carpeta donde colocó los tres archivos:

  • voip_services.cer
  • certificado.p12

1 - Abra una terminal y cree un archivo pem a partir del archivo de certificado:

#openssl x509 -in voip_services.cer -inform der -out PushVoipCert.pem

2 - Crear un archivo pem a partir del archivo de clave privada exportado:

#openssl pkcs12 -nocerts -out PushVoipKey.pem -in certificate.p12

3 - Une ambos archivos pem en uno:

#cat PushVoipCert.pem PushVoipKey.pem > ck.pem

Para enviar inserciones, puede usar Pusher del tutorial tutoriales de raywenderlich o usar un simple script php:

<?php // Put your device token here (without spaces): $deviceToken = ''0f744707bebcf74f9b7c25d48e3358945f6aa01da5ddb387462c7eaf61bbad78''; // Put your private key''s passphrase here: $passphrase = ''pushchat''; // Put your alert message here: $message = ''My first push notification!''; //////////////////////////////////////////////////////////////////////////////// $ctx = stream_context_create(); stream_context_set_option($ctx, ''ssl'', ''local_cert'', ''ck.pem''); stream_context_set_option($ctx, ''ssl'', ''passphrase'', $passphrase); // Open a connection to the APNS server $fp = stream_socket_client( ''ssl://gateway.sandbox.push.apple.com:2195'', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); if (!$fp) exit("Failed to connect: $err $errstr" . PHP_EOL); echo ''Connected to APNS'' . PHP_EOL; // Create the payload body $body[''aps''] = array( ''alert'' => $message, ''sound'' => ''default'' ); // Encode the payload as JSON $payload = json_encode($body); // Build the binary notification $msg = chr(0) . pack(''n'', 32) . pack(''H*'', $deviceToken) . pack(''n'', strlen($payload)) . $payload; // Send it to the server $result = fwrite($fp, $msg, strlen($msg)); if (!$result) echo ''Message not delivered'' . PHP_EOL; else echo ''Message successfully delivered'' . PHP_EOL; // Close the connection to the server fclose($fp);

debes modificar en el script:

  • $ deviceToken agregando sus PushCredentials (de los registros de la aplicación)
  • $ passphrase por la frase de contraseña que agregó en el paso 2 al crear PushVoipKey.pem

Eso es. Ejecutar script PHP:

#php simplePushScript.php

y debería recibir su notificación push de VoIP (debería ver el registro de la aplicación: "didReceiveIncomingPushWithPayload")

Después de esa prueba, me pregunté cómo podría recibir notificaciones push estándar a través del marco de trabajo de pushkit, pero desafortunadamente no tengo respuesta ya que al registrar el tipo de inserción no pude encontrar ningún otro PKPushType que no sea PKPushTypeVoIP ...

pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];

¡Eso es todo! ¡Gracias por leer!


Hoy exploré esto con gran detalle. Yo también me preguntaba cómo usar el token push generado en una compilación de desarrollo cuando Apple solo nos permite generar un certificado push VoIP de producción.

En el servidor, debe enviar un envío de producción a gateway.push.apple.com y un gateway.push.apple.com desarrollo / sandbox a gateway.sandbox.push.apple.com . Pude generar y recibir actualizaciones de VoIP en una versión de desarrollo de mi aplicación usando el certificado de VoIP de producción en gateway.sandbox.push.apple.com . Todavía no lo he intentado, pero supongo que también funcionará en una compilación ad hoc o de producción y usando gateway.push.apple.com .

Además, tenga en cuenta que las notificaciones push no funcionan en absoluto en el simulador.