Implementar PushKit y probar en comportamiento de desarrollo

Me gustaría implementar el service PushKit dentro de mi aplicación (aplicación Voip), pero tengo la siguiente duda: veo que puedo generar solo el certificate de producción voip, ¿funciona si bash probar el service de notificación push voip en el desarrollo del dispositivo?

Esta es mi testing de implementación:

Con esta 3 línea de código puedo get token push en la callback didUpdatePushCnetworkingentials que uso para save en mi server.

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

El lado del server genero una notificación de envío de carga útil "normal" con solo text de alerta, y lo envié a voip token almacenado en mi server.

¡Utilizo la callback con el logging de debugging, 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 didUpdatePushCnetworkingentials:(PKPushCnetworkingentials *)cnetworkingentials forType:(NSString *)type { if([cnetworkingentials.token length] == 0) { NSLog(@"voip token NULL"); return; } NSLog(@"didUpdatePushCnetworkingentials: %@ - Type: %@", cnetworkingentials.token, type); } 

Si trato de generar un post de notificación push desde mi server para activar el token del dispositivo previamente cargado, nunca me notificaron en la callback didReceiveIncomingPushWithPayload, pero desde el server recibo 200 post ok (el post se envió con éxito)

En caso de que alguien esté interesado en probar las notifications 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 a Apple Developer y obtenga acceso a Certificados, Identificadores y Perfiles. En el centro miembro.

  • Identificadores internos-> ID de la aplicación Crea una nueva identificación de la aplicación
  • Dispositivos internos-> Todos Agregar dispositivos UDID que desea usar para probar empujones voip
  • Certificados internos-> Todos Cree un nuevo certificate de producción: Certificado de services de VoIP. Seleccione la ID de la aplicación creada anteriormente para su Certificado de service de voip. Seleccione la CSR (Solicitud de firma de certificate) creada anteriormente y, una vez creada, descargue su nueva voip_services.cer

Una vez descargado, haga doble clic en voip_services.cer para abrir la aplicación de acceso a llavero y exportar key privada para el certificate generado: button derecho Exportar file certificate.p12 .

Guarde el file voip_services.cer y certificate.p12 en una carpeta para crear su generador de notifications push de server

Finalmente vaya nuevamente al website 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 quiera usar para probar los push voip. Descargue este perfil y arrástrelo y suéltelo en su xcode para utilizarlo en su aplicación.

Ahora vamos a crear la aplicación para iOS que recibirá notifications push de voip:

  • Cree una nueva aplicación de vista única desde el nuevo menu del proyecto Xcode.
  • Rellene su identificador de package de acuerdo con la ID de la aplicación creada en la sección anterior.
  • Agregue PushKit.framework en general-> Frameworks y bibliotecas vinculadas.
  • En Capabilities, habilite el Modo en segundo plano y select la opción Voz sobre IP.
  • En Configuración de compilation -> Firma de código, select el perfil de aprovisionamiento que descargó previamente y select Distribución como identidad de firma de código.

Permite agregar en la aplicación el código agregado por Pasquale en su pregunta:

En el encabezado del controller de vista raíz ( ViewController.h ), una import para PushKit.framework:

 #import <PushKit/PushKit.h> 

Agregue delegado para implementar sus funciones:

 @interface ViewController : UIViewController <PKPushRegistryDelegate> 

Agregue la function viewDidLoad de su controller de vista raíz (ViewController.m) push registration:

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

Implementar las funciones delegadas requeridas:

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

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

Ejecutarlo y get de los loggings los PushCnetworkingentials que utilizaremos para enviar pushes.

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

Regrese a la carpeta donde colocó los tres files:

  • voip_services.cer
  • certificate.p12

1 – Abra un terminal y cree un file pem del file de certificate:

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

2 – Crear file pem del file de key privada exportada:

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

3 – Unir ambos files pem en uno:

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

Para enviar empujones puedes usar Pusher desde el tutorial de 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 delivenetworking' . PHP_EOL; else echo 'Message successfully delivenetworking' . PHP_EOL; // Close the connection to the server fclose($fp); 

debe modificar en secuencia de commands:

  • $ deviceToken al agregar sus PushCnetworkingentials (desde los loggings de la aplicación)
  • $ passphrase por la 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 voip (debería ver el logging de la aplicación: "didReceiveIncomingPushWithPayload")

Después de esa testing, me pregunté cómo podría recibir notifications push estándar a través del marco Pushkit, pero desafortunadamente no tengo respuesta ya que al registrar el tipo push no pude encontrar ningún otro PKPushType sino el PKPushTypeVoIP …

 pushRegistry.desinetworkingPushTypes = [NSSet setWithObject:PKPushTypeVoIP]; 

¡Eso es todo! ¡Gracias por leer!

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

En el server, debe enviar una inserción de producción a gateway.push.apple.com y un desarrollo / sandbox push to gateway.sandbox.push.apple.com . Pude generar y recibir empujones de VoIP en una compilation de desarrollo de mi aplicación usando el certificate 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 compilation ad hoc o de producción y utilizando gateway.push.apple.com .

Además, tenga en count que las notifications push no funcionan en absoluto en el simulador.

Debe habilitar también Notificaciones remotas, incluso si no las utiliza:

  • dentro de su identificador de ID de la aplicación en el portal de desarrolladores
  • recrear los perfiles de aprovisionamiento de desarrollo
  • presiona Descargar todo en XCode -> Preferences … -> Cuentas -> tu count
  • habilitar notifications remotas en capacidades -> modos de background

Al hacer esto, recibirá la callback del delegado tanto en Depuración como en Liberación.