suenan que notificaciones llegan las historial apple apns iphone objective-c ios ipad push-notification

iphone - que - La notificación push de Apple no se entrega



notificaciones push iphone (1)

Sé que está un poco inundado con los problemas del servicio de notificación de inserción (APN) de Apple en todo StackOverflow, así que de hecho hice muchas investigaciones antes de plantear mi pregunta.

Básicamente, he seguido el CertificateCreation de apns-php , algunos tutoriales como en mobiforge y algunos de Matthijs Hollemans . Aún así, no puedo recibir ninguna notificación publicada en mi iPad 2.

Básicamente estos son los pasos que he hecho:

  1. Seguí el tutorial de CertificateCreation , salí con server_certificates_bundle_sandbox.pem , entrust_root_certification_authority.pem .
  2. Siguiendo el tutorial especificado en el blog mobiforge , creé con éxito el ID de la aplicación, el perfil de aprovisionamiento y los vinculé muy bien.

    • Descripción: APNTest
    • ID de semilla de paquete: usar ID de equipo
    • Identificador de paquete: com.learn.APN
  3. Luego habilito el Certificado SSL de Desarrollo de Desarrollo (solo por ahora) usando la misma solicitud de certificado que he usado ahora para obtener los certificados, y los descargo e instalo en mi llavero.

  4. Descargué mi perfil de aprovisionamiento en el archivo .mobileprovision y lo .mobileprovision en el Organizador de Xcode en mi dispositivo iPad 2.

  5. A continuación, creo una aplicación simple con solo estos códigos:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)]; // Override point for customization after application launch. return YES; } - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSLog(@"%@", deviceToken); } - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { NSLog(@"Error: %@", error); }

  6. Luego configuro los parámetros de compilación:

    • Objetivos> Información> Identificador de compilación: net.learn.APN
    • Objetivos> Configuraciones de compilación> Identidad de firma de código> (Elegí el perfil de provisión que instalé recientemente y selecciona automáticamente los perfiles idénticos para mi Debug and Release)
  7. Construyo y ejecuto la aplicación en mi iPad 2. Mi aplicación solicitó la notificación de inserción y después de que la aprobé, la identificación del token apareció en mi consola:

    2012-01-19 12:43:26.345 TestAPN[578:707] <3cb08612 9392996b 5332d2fc 5adce03d 994f8959 d7a2ac38 de7bed52 c8e0778e>

  8. Usé apns-php , cambié la identificación del dispositivo (valores sample_push.php crudos), luego sample_push.php el sample_push.php . La secuencia de comandos se ejecutó correctamente, pero mi dispositivo no recibe ninguna notificación

  9. Luego trato de usar SimplePush.php . Apareció un "Mensaje entregado con éxito", pero mi iPad aún no recibe ninguna notificación de APN

La pregunta es, ¿qué pasos he hecho incorrectamente? Soy bastante novato en esta área, y en realidad es un requisito para mi proyecto que el servidor necesite enviar mensajes a nuestras propias aplicaciones. Somos conscientes de los softwares de terceros que envían APN en su nombre, pero quisiéramos implementar uno nosotros mismos.

También me encontré con el " Servicio de retroalimentación de APN " y escribí esto (base en el SimplePush) pero lamentablemente está vacío. ¿Qué debería hacer ahora?

<?php // Put your private key''s passphrase here: $passphrase = ''''; $ctx = stream_context_create(); stream_context_set_option($ctx, ''ssl'', ''local_cert'', ''server_certificates_bundle_sandbox.pem''); stream_context_set_option($ctx, ''ssl'', ''passphrase'', $passphrase); // Open a connection to the APNS server $fp = stream_socket_client( ''ssl://feedback.sandbox.push.apple.com:2196'', $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; while (!feof($fp)) { $data = fgets($fp, 1024); var_dump(unpack("N1timestamp/n1length/H*devtoken", $data)); } // Close the connection to the server fclose($fp);

Nota

  1. Soy consciente de las diferencias entre los certificados de desarrollo / producción.
  2. iPad no tiene jailbreak, ejecuta iOS 5.0.1
  3. Otras aplicaciones de App Store reciben notificaciones normalmente
  4. XCode 4.2.1, Lion 10.7.2

Espero que no esté duplicado ninguna de las preguntas aquí ...;)

EDITAR

Cuando ejecuto php simplepush.php entonces php feedback.php , recibí un comentario con mi ID de dispositivo. Mi aplicación todavía está en el iPad, ¿significa que la identificación de mi dispositivo es incorrecta?

[root@ip-xx-xx-xx-xx SimplePush]# php feedback.php Connected to APNS array(3) { ["timestamp"]=> int(1326962028) ["length"]=> int(32) ["devtoken"]=> string(64) "3cb086129392996b5332d2fc5adce03d994f8959d7a2ac38de7bed52c8e0778e" }

Gracias

EDITAR

Después de mucho forcejear y rehacer todos los pasos escritos por Matthijs Hollemans , finalmente lo hago funcionar. Entonces, el problema radica en el archivo PEM incorrecto generado ... hmm


Tuve un problema similar, para mí la clave que no sabía es que el token del dispositivo es diferente para dev y prod (para el mismo dispositivo) .

Estaba usando el token de dispositivo que obtuve al probar en dev para probar en prod. Esto funcionaba bien en dev, pero cuando cambié a prod, mantuve el mismo token de dispositivo en mi script de python (asumiendo, erróneamente, que el token del dispositivo sería el mismo para el mismo dispositivo) pero el token de dispositivo real registrado en prod era diferente.

En la práctica esto no sucedería ya que el token del dispositivo se envía al servidor, pero cuando estaba probando estaba usando token de dispositivo codificado duro porque no quería involucrar al servidor.

Con suerte, esto salvará a alguien de la frustración.