¿Cómo puedo obtener el Dispositivo Token para el control remoto de notificaciones en iOS 8?
He utilizado el método de didRegisterForRemoteNotificationsWithDeviceToken en AppDelegate en iOS < 8, y se devuelve el dispositivo token. Pero en iOS 8, no.

InformationsquelleAutor quang thang | 2014-06-14

7 Comentarios

  1. 180

    Leer el código en UIApplication.h.

    Usted sabrá cómo hacerlo.

    Primero:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    agregar un Código como este

    if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
    #ifdef __IPHONE_8_0
      UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert 
          | UIUserNotificationTypeBadge 
          | UIUserNotificationTypeSound) categories:nil];
      [application registerUserNotificationSettings:settings];
    #endif
    } else {
      UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
      [application registerForRemoteNotificationTypes:myTypes];
    }

    si usted no utiliza tanto en Xcode 5 y Xcode 6 ,prueba este código

    if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
      UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge
          |UIRemoteNotificationTypeSound
          |UIRemoteNotificationTypeAlert) categories:nil];
      [application registerUserNotificationSettings:settings];
    } else {
      UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
      [application registerForRemoteNotificationTypes:myTypes];
    }

    (Gracias por @zeiteisen @dmur ‘s recordar)


    Segundo:

    Agregar esta Función

    #ifdef __IPHONE_8_0
    - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
    {
        //register to receive notifications
        [application registerForRemoteNotifications];
    }
    
    - (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void(^)())completionHandler
    {
        //handle the actions
        if ([identifier isEqualToString:@"declineAction"]){
        }
        else if ([identifier isEqualToString:@"answerAction"]){
        }
    }
    #endif

    Y puede obtener la deviceToken en

    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken

    si aún así no funciona , utilice esta función NSLog la error

    -(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
    • Este. Sophomorically suficiente, Apple no se ha podido actualizar su documentación para UIUserNotificationSettings o UIApplication hablando acerca de cómo esto es necesario para iOS 8. Es enterrado en su API diffs en su lugar.
    • Esto va a bloquear en las versiones de iOS por debajo de iOS 8. #ifdef es un COMPILADOR de la función, y se evalúa en tiempo de compilación. Usted todavía necesita una comprobación en tiempo de ejecución!
    • debido a su XCode no el último.
    • Eso no es cierto. Trate de ejecutar este código en iOS 7 o por debajo del dispositivo. Se estrellará. Si usted compilar el código de la última versión de Xcode, SÓLO la primera mitad del código se corrió, y el #otra parte no serán compiladas en código.
    • __IPHONE_8_0 es trabajar en XCode5. Estoy usando este código en mi proyecto.Yo intente en iOS6 idear.
    • Puedo usar xcode 6 beta 6 y #ifdef __IPHONE_8_0 trabajo con por debajo de ios 8. Así que debo cambiar para if(NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1)
    • Utilizar esta macro para comprobar para iOS 8: #define isAtLeastiOS8 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) . __IPHONE_8_0 no es un buen cheque, porque desea que este código para que se siga ejecutando en futuras versiones también.
    • Sí, pero __IPHONE_8_0 también se define en futuras versiones. Como __IPHONE_7_0 funciona bajo iOS 8… así que en realidad, usted puede usar cualquiera.
    • Echa un vistazo al archivo de encabezado de la Disponibilidad.h y usted verá lo que quiero decir… puedes comando-clic en __IPHONE_8_0 para abrir el archivo. Allí podrás ver que todas las versiones hasta la actual es #define, no sólo la actual.
    • Dicho esto, en este caso el #ifdef es innecesario, a menos que su equipo está utilizando tanto en Xcode 5 y Xcode 6. En lugar usted debe hacer un if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) { de verificación, como zeiteisen hace en su respuesta.
    • Lo siento mucho por eso. gracias por [email protected]
    • Esto en realidad es incorrecta y debe ser rechazada. La aplicación:didRegisterUserNotificationSettings: método no será llamado hasta que llame al UIApplication registerForRemoteNotification método. Usted no llama a que en el método.
    • será llamado después de [application registerUserNotificationSettings:] (usuario se le pedirá para permitir las notificaciones).
    • Poco corrección para obsoleto enum UIRemoteNotificationType: NS_ENUM_DEPRECATED_IOS(3_0, 8_0, «Uso UIUserNotificationType para las notificaciones para el usuario y registerForRemoteNotifications para recibir remoto notificaciones en su lugar.»); Así, para iOS 8 y más tarde, debe utilizar UIUserNotificationTypeBadge, UIUserNotificationTypeSound, UIUserNotificationTypeAlert. (UIUserNotificationType para las nuevas versiones, UIRemoteNotificationType – para los mayores). Las enumeraciones se define en <UIKit/UIApplication.h> y <UIKit/UIUserNotificationSettings.h>
    • Si desea que el código se compila en xcode 5.x existe también esta respuesta stackoverflow.com/a/25871600/756809
    • #ifdef no es una buena forma de apoyar a la nueva Api, significa que la aplicación se bloquee en dispositivos con iOS7. respondsToSelector es la forma correcta de hacer la comprobación en todos los casos.
    • Soy la incomprensión de lo que se supone que debe ocurrir aquí? He añadido este código, pero la aplicación:didRegisterForRemoteNotificationswithdevicetoken nunca se llama en mi iOS8 iPhone. didRegisterUserNotificationSettings se llamado, ¿hay algo más que tengo que hacer allí?
    • Usted tiene que llamar a completionHandler(); cuando se realizan en handleActionWithIdentifier como se mencionó en Apple Docs
    • Usted salvó mi piel! He estado teniendo problemas con las notificaciones push, por alrededor de 3 días y ahora … y este post tenía la clave! No estaba recibiendo nuevos símbolos, incluso si me cambio de desarrollar aplicaciones ad-hoc …. Creo que el problema era que yo no implementar didRegisterUserNotificationSettings … una Vez más, muchas gracias!

  2. 75

    La forma de registro para iOS 8 y mantener el apoyo a las versiones anteriores

    UIApplication *application = [UIApplication sharedApplication];
    if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge
                                                                                             |UIUserNotificationTypeSound
                                                                                             |UIUserNotificationTypeAlert) categories:nil];
        [application registerUserNotificationSettings:settings];
    } else {
        UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
        [application registerForRemoteNotificationTypes:myTypes];
    }

    y en la aplicación delegado agregar

    - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
        [application registerForRemoteNotifications];
    }

    iOS8 puede recibir en silencio notificaions sin pedir permiso. Llame
    - (void)registerForRemoteNotifications. Después de este application:didRegisterForRemoteNotificationsWithDeviceToken: será llamado

    Nota: la devolución de llamada con el token se llama sólo si la aplicación ha registrado con éxito para las notificaciones para el usuario con la función de abajo o si el Fondo de la Aplicación de Actualización está habilitado.

    Compruebe la Configuración de la aplicación si cualquier tipo de notificación está activada. Si no, usted no va a obtener un dispositivo token.

    Que ahora son capaces de obtener en silencio las notificaciones con

    aps {
    content-available: 1
    }

    en la carga de la notificación

    Pero las notificaciones que aparecen todavía necesita el permiso. Llame

    UIUserNotificationType types = UIUserNotificationTypeSound | UIUserNotificationTypeBadge | UIUserNotificationTypeAlert;
    UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
    [application registerUserNotificationSettings:notificationSettings];

    Este código debe pedir permiso.

    Ahora debería estar listo para recibir notificaciones push

    • Esto debe ser aceptado respuesta
    • gracias por la OS8 can receive silent notifications without asking for permission poco. Que me estaba volviendo loco y este es el único lugar que he encontrado de gran ayuda, poco!
    • en su primera if declaración, usted debe utilizar UIUserNotificationTypeSound en lugar de UIRemoteNotificationTypeSound, desde UIRemoteNotificationType está en desuso en iOS 8.
    • Puede alguien explicar por qué la devolución de llamada con el token se llama sólo cuando el Fondo de la Aplicación de Actualización está habilitado? A pesar de que debería ser llamado cuando la Notificación de Inserción está habilitado el permiso de…
  3. 15

    En mi caso yo había hecho las actualizaciones necesarias a solicitud de notificación de inserción de acceso para iOS 7 y iOS 8, sin embargo no me había implementado la nueva de devolución de llamada para cuando una versión de iOS 8 el usuario concede el acceso. Necesitaba agregar este método a mi aplicación delegado.

    - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
        [application registerForRemoteNotifications];
    }
  4. 1

    Si usted está usando Xamarin.iOS para crear su aplicación móvil, usted puede utilizar este fragmento de código a petición de notificación de inserción de registro

    if (UIDevice.CurrentDevice.CheckSystemVersion(8,0))
    {
        UIUserNotificationType userNotificationTypes = UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound;
        UIUserNotificationSettings settings = UIUserNotificationSettings.GetSettingsForTypes(userNotificationTypes, null);
        UIApplication.SharedApplication.RegisterUserNotificationSettings(settings);
    }
    else
    {
        UIRemoteNotificationType notificationTypes = UIRemoteNotificationType.Alert | UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound;
        UIApplication.SharedApplication.RegisterForRemoteNotificationTypes(notificationTypes);
    } 

    También necesitará reemplazar DidRegisterUserNotificationSettings método para obtener el dispositivo token devuelto de la APN servidor:

    public override void DidRegisterUserNotificationSettings(UIApplication application, UIUserNotificationSettings notificationSettings)
    {
        application.RegisterForRemoteNotifications();
    }
  5. 1

    La respuesta de Madao (https://stackoverflow.com/a/24488562/859742) es correcto, pero….

    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge

    debe ser más «correcta»

    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert) categories:nil];

    Los indicadores tienen la misma máscara de bits de los valores y es por eso que tanto iba a funcionar pero UIUserNotificationSettings requiere UIUserNotificationType no UIRemoteNotificationType.

    Aparte de que yo llamaría

    [application registerUserNotificationSettings:settings];

    En el AppDelegate método (dependiendo de los derechos concedidos),

    - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
    • ¿Cuál es la diferencia?
    • UIUserNotificationTypeBadge y UIRemoteNotificationTypeBadge son las mismas máscaras de bits pero significan cosas diferentes =)
  6. 0

    Pienso que la mejor manera de mantener la compatibilidad con versiones anteriores podemos ir con este enfoque, se está trabajando para mi caso la esperanza de trabajar para usted. También es bastante fácil de entender.

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
        {
            [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
            [[UIApplication sharedApplication] registerForRemoteNotifications];
        }
        else
        {
            [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
             (UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)];
        }
  7. 0
    UIUserNotificationType types = UIUserNotificationTypeBadge |
        UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
    
        UIUserNotificationSettings *mySettings =
        [UIUserNotificationSettings settingsForTypes:types categories:nil];
    
        [[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];
    
        [application registerForRemoteNotifications];

Dejar respuesta

Please enter your comment!
Please enter your name here