15

Estoy desarrollando una aplicación para iPhone que necesita notificación push. Seguí las instrucciones para crear las certificaciones y modificar la ID de la aplicación. No estoy totalmente seguro de haber hecho esto correctamente, pero sí seguí las instrucciones. ¿Alguna idea de cómo puedo verificar para ver si esto está bien?iPhone registerForRemoteNotificationTypes no genera un error pero no activa el delegado que proporciona el token del dispositivo

Cuando ejecuté en el emulador, recibí un mensaje de error que decía que el emulador no admitía notificaciones push. Esto fue algo esperado.

Por cierto: Tengo esta pregunta por ahí algunas veces. Siempre parece estar con un teléfono roto. Mi teléfono NO está roto en la cárcel.

Pero cuando depuro en el iPhone el método didRegisterForRemoteNotificationsWithDeviceToken nunca se activa. Realmente agradeceré algo de ayuda. Mi código sigue.

-(void)applicationDidFinishLaunching:(UIApplication *)application 
{  
    rootController.delegate = self; 
    [window addSubview:rootController.view]; 
    [window makeKeyAndVisible]; 

    [[UIApplication sharedApplication] 
    registerForRemoteNotificationTypes: 
    (UIRemoteNotificationTypeAlert | 
    UIRemoteNotificationTypeBadge | 
    UIRemoteNotificationTypeSound)]; 
} 

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 
{ 
    NSString *str = 
    [NSString stringWithFormat:@"%@",deviceToken]; 
    NSLog(str); 
} 

- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err 
{ 
    NSString *str = [NSString stringWithFormat: @"Error: %@", err]; 
    NSLog(str);  
} 
+0

¿Qué certificado está utilizando para ejecutar la aplicación? Creo que esto puede tener un impacto. – Jonathan

Respuesta

2

Salida TN2265, que tiene pistas para depurar problemas de notificación de inserción. Tuve exactamente este problema hoy y resultó que WiFi se apagó en el iPod Touch. Como dijiste que estabas trabajando desde un iPhone. probablemente no sea así, pero vale la pena consultar la nota técnica para obtener más posibilidades.

1

Compruebe la configuración de su firewall.

De Scott K's Answer:

If your iOS device is capable of using the cellular data network, check that it has an active cellular data plan. Turn off Wi-Fi in Settings and see if you can still browse the web with Safari, for example. On the other hand, if the push service is using Wi-Fi, any firewalls between your device or computer and the Internet must allow TCP traffic to and from port 5223.

19

lo general, si didRegisterForRemoteNotificationsWithDeviceToken Nunca se llama, es porque está utilizando un perfil de aprovisionamiento que no es APS-entitled. Si su aplicación es una aplicación de producción, debe estar firmada con un perfil de distribución para que los empujes funcionen. Si se trata de una aplicación de desarrollo, debe firmarla con un perfil de desarrollo.

EDIT: También vale la pena señalar que el provisioning profile debe usar un identificador de paquete explícito. Las tiradas enviadas a cualquier cosa firmada con un perfil comodín no serán entregadas.

+0

Gracias, olvidé reemplazar el perfil de aprovisionamiento por el nuevo – htafoya

+0

Esto tiene mucho sentido, excepto por el hecho aparente de que 'didFailToRegisterForRemoteNotificationsWithError:' no se llama en este caso? ¿Es esto realmente así? – WiseOldDuck

+0

Sí, realmente no hay devolución de llamada si no activa esa capacidad – Sulfkain

9

Tuve el mismo problema.

Para mí, era la configuración de notificación para la aplicación que tenía todo apagado.

Si en las configuraciones de iOS las notificaciones de la aplicación están deshabilitadas, no se llamará a ese método.

Una vez que encendí un tipo de notificación, comenzó a funcionar.

Settings App->Notification Settings->[My App]

+0

¿Dónde está eso? – hasan83

+0

@hasan, en la aplicación Configuración de iOS. No es tanto una solución, sino una explicación del problema. Si alguien desactiva las notificaciones de su aplicación, no obtendrá un error ni una llamada a un método. – Eric

+0

@hasan ¿Estás diciendo que si un usuario desactiva las notificaciones automáticas para mi aplicación, entonces ni didRegisterForRemoteNotificationsWithDeviceToken ni didFailToRegisterForRemoteNotificationsWithError recibirán una llamada? – PaulG

1

De acuerdo con la documentación "Solución de problemas notificaciones push" de Apple "Si ni la aplicación de devolución de llamada delegado: didRegisterForRemoteNotificationsWithDeviceToken: ni a la aplicación: didFailToRegisterForRemoteNotificationsWithError:. Se llama, lo que significa que aún no se ha establihed esta conexión" ... "Es posible que el sistema no tenga conectividad a Internet ... modo aeroplano".

Estoy viendo este comportamiento también pero NO debido a la falta de conectividad a Internet sino porque, como señaló IrFan, las notificaciones fueron deshabilitadas para la aplicación, tan pronto como habilite las notificaciones, el método se dispara.

Solución 1) NO confíe en ninguno de estos métodos delegados. 2) Si, y cuando, recibe una devolución de llamada de delegado, actúe en consecuencia. 3) Falta de conectividad de red, notificaciones de inserción desactivadas para la aplicación, APS no habilitado o? hará que los delegados NO sean llamados.

1

Si está compilando utilizando el iOS8 + SDK (por ejemplo, xcode 6+), los métodos de la API iOS7 en desuso son ignorados silenciosamente y no obtendrá ningún error.

Usted necesita algo como esto si quieres apoyar iOS7 y 8:

// Have to explicitly use the iOS8 api as the deprecated API is silently ignored on iOS8, surprisingly. 
if ([UIDevice currentDevice].systemVersion.intValue >= 8) { // iOS8+ API. 
    UIUserNotificationType types = UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge; 
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil]; 
    [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; 
    [[UIApplication sharedApplication] registerForRemoteNotifications]; 
} else { // iOS7. 
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes: 
     UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound]; 
} 

Si está teniendo problemas con aps-environment que faltan en su perfil, que al menos obtendrá una respuesta de error útiles con didFailToRegisterForRemoteNotificationsWithError

+0

En mi caso, me faltaba la llamada a 'registerUserNotificationSettings:' (yo estaba bajo el supuesto de que debería conectar en cadena y llamarlo desde la devolución de llamada correcta). Llamar a 'registerForRemoteNotifications' no inicia el proceso de registro. –

Cuestiones relacionadas