2012-01-19 20 views
9

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 hice muchas investigaciones antes de plantear mi pregunta.Apple Push Notification no se entrega

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

Básicamente estos son los pasos que he hecho:

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

    • Descripción: APNTest
    • ID de paquete de semillas: uso Nº equipo
    • Bundle Identificador: com.learn.APN
  3. Entonces me permiten el SSL impulsar el desarrollo Certificado (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. He descargado mi perfil de aprovisionamiento en el archivo .mobileprovision y lo he cargado en el organizador de Xcode en mi dispositivo iPad 2.

  5. siguiente que crear una aplicación sencilla con sólo 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. Entonces configurar los parámetros de construcción:

    • Objetivos> Información> Crecimiento Identificador: net.learn.APN
    • Objetivos> Configuraciones de compilación> Identidad de firma de código> (Elegí el perfil de aprovisionamiento que he instalado en este momento, y selecciona automáticamente el ide ntical perfiles para mi depuración y liberación)
  7. que generar y ejecutar la aplicación en mi iPad 2. Mi aplicación solicitante para notificaciones push y después de que lo aprobó, con el simbólico ID aparecieron en mi consola:

    2012-01-19 12:43:26.345 TestAPN[578:707] <3cb08612 9392996b 5332d2fc 5adce03d 994f8959 d7a2ac38 de7bed52 c8e0778e> 
    
  8. Utilicé apns-php, cambié la identificación del dispositivo (valores hexadecimales crudos 64), luego ejecuté el sample_push.php. La secuencia de comandos se ejecutó correctamente, pero mi dispositivo no recibe ninguna notificación

  9. Luego trato de usar el SimplePush.php.Apareció un mensaje "Mensaje entregado correctamente", 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 encontré el "APN Feedback Service" 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 CERT desarrollo/producción.
  2. iPad no está jailbreak, con iOS 5.0.1
  3. Otras aplicaciones de la App Store recibe notificaciones normalmente
  4. XCode 4.2.1, Lion 10.7.2

Yo espero no estar duplicados cualquiera de las preguntas aquí ..;)

EDIT

cuando corro php simplepush.php continuación php feedback.php, I rec Eived 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?

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

Gracias

EDITAR

Después de mucha lucha y volver a hacer todos los pasos escritos por Matthijs Hollemans, por fin conseguir que funcione. Así que el problema radica en el archivo PEM incorrecto generado ... hmm

+0

Restablezco todo y reinicio todos los pasos @ http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-part-12 y ahora la notificación de inserción funciona ... hmm –

+0

La notificación de inserción el servicio ha estado teniendo problemas en los últimos días. Apple envió un correo electrónico para regenerar sus perfiles de aprovisionamiento. Es posible que haya sido atrapado en eso. –

+0

Gracias.He resuelto mi problema siguiendo de cerca todos los pasos en raywenderlich.com. Creo que esto tiene algo que ver con el problema del certificado. De todos modos, he resuelto mi problema. ¿Debo publicar mi respuesta? (Básicamente es lo mismo que la página) –

Respuesta

16

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 to test 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.

Esperemos que esto le ahorrará a alguien un poco de frustración.

+0

. Pero todavía no he alcanzado el certificado de producción. . ¿Cómo podría siquiera meterme con eso? ¡Gracias por la rápida respuesta! –

+0

¡Esto es absolutamente correcto! El token del dispositivo en modo de producción es diferente del que está en modo de desarrollo. He estado golpeándome la cabeza durante horas tratando de descubrir qué estaba mal, y esto lo resolvió. ¡Gracias! – Mahouk

+0

Esta respuesta acaba de resolver un dolor de cabeza que tuve entre los problemas del cliente y yo, las pruebas personales durante bastante tiempo. Simplemente no pudo identificar el problema. Me llevo mi sombrero de señor! Gracias un montón. p.s. Mi problema incluso me llevó a cambiar los archivos .pem utilizados por el backend para el entorno prod/dev. –

Cuestiones relacionadas