Cuando intente registrarse para recibir notificaciones push en iOS 8.x:
application.registerForRemoteNotificationTypes(UIRemoteNotificationType.Alert | UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound)
Obtuve el siguiente error:
registerForRemoteNotificationTypes: is not supported in iOS 8.0 and later.
¿Alguna idea de cuál es la nueva forma de hacerlo? Funciona cuando ejecuto esta aplicación Swift en iOS 7.x.
EDITAR
En iOS 7.x cuando incluyo el código condicional que obtengo (ya sea SystemVersion conditional o #if __IPHONE_OS_VERSION_MAX_ALLOWED> = 80000)
dyld: Symbol not found: _OBJC_CLASS_$_UIUserNotificationSettings
objective-c
ios8
apple-push-notifications
dyld
Wojtek Turowicz
fuente
fuente
Respuestas:
Como describió, necesitará usar un método diferente basado en diferentes versiones de iOS. Si su equipo está utilizando Xcode 5 (que no conoce ningún selector de iOS 8) y Xcode 6, entonces deberá usar la compilación condicional de la siguiente manera:
Si solo usa Xcode 6, puede seguir con esto:
La razón es que la forma en que obtienes los permisos de notificación ha cambiado en iOS 8. A
UserNotification
es un mensaje que se muestra al usuario, ya sea de forma remota o local. Necesitas obtener permiso para mostrar uno. Esto se describe en el video de WWDC 2014 "Novedades en las notificaciones de iOS"fuente
__IPHONE_OS_VERSION_MAX_ALLOWED
para verificar esto porque es una verificación en tiempo de compilación.registerUserNotificationSettings:
está documentado aquíPara iOS <10
Para iOS10
fuente
systemVersion
, debe verificar[[UIApplication sharedApplication] respondsToSelector:@selector(isRegisteredForRemoteNotifications)]
[[UIApplication sharedApplication] registerForRemoteNotifications];
no iráapplication:didRegisterForRemoteNotificationsWithDeviceToken:
aoapplication:didFailToRegisterForRemoteNotificationsWithError:
si un usuario deshabilitó "Permitir notificaciones" en Configuración -> Notificaciones -> <Mi aplicación>.Sobre la base de la respuesta de @ Prasath. Así es como lo haces en Swift :
fuente
iOS 8 ha cambiado el registro de notificaciones de una manera no compatible con versiones anteriores. Si bien debe admitir iOS 7 y 8 (y aunque no se aceptan aplicaciones creadas con 8 SDK), puede verificar los selectores que necesita y llamarlos condicionalmente correctamente para la versión en ejecución.
Aquí hay una categoría en la aplicación UIA que ocultará esta lógica detrás de una interfaz limpia que funcionará tanto en Xcode 5 como en Xcode 6.
Encabezamiento:
Implementación:
fuente
Settings
notificaciones y las deshabilito,isRegisteredForRemoteNotifications
aún regresaYES
Creo que esta es la mejor manera de mantener la compatibilidad con versiones anteriores si seguimos este enfoque, está funcionando para mi caso y espero que funcione para usted. También es bastante fácil de entender.
fuente
if ([UIApplication instancesRespondToSelector:@selector(registerForRemoteNotifications)])
como se muestra aquíPara la inclinación rápida:
fuente
No pude averiguar a qué se debe establecer la variable NSSet de "categorías", por lo que si alguien me puede completar, con gusto editaré esta publicación. Sin embargo, lo siguiente abre el cuadro de diálogo de notificación push.
Editar: recibí una notificación automática para enviar a mi teléfono con este código, por lo que no estoy seguro de que el parámetro de categorías sea necesario.
fuente
categories
se usa para configurar acciones de notificación en iOS 8. Puede ver el video WWDC 2014 "Novedades en las notificaciones de iOS" para obtener más detallesEntonces resulta que debido a que AnyObject es el sucesor espiritual de la identificación, puede llamar a cualquier mensaje que desee en AnyObject. Eso es el equivalente a enviar un mensaje a id. OK bastante justo. Pero ahora agregamos el concepto de que todos los métodos son opcionales en AnyObject , y tenemos algo con lo que podemos trabajar.
Teniendo en cuenta lo anterior, tenía la esperanza de poder enviar UIApplication.sharedApplication () a AnyObject, luego crear una variable igual a la firma del método, establecer esa variable en el método opcional y luego probar la variable. Esto no pareció funcionar. Supongo que cuando se compila contra el SDK de iOS 8.0, el compilador sabe dónde cree que debería estar ese método , por lo que optimiza todo esto a una búsqueda de memoria. Todo funciona bien hasta que trato de probar la variable, en ese momento obtengo un EXC_BAD_ACCESS.
Sin embargo, en la misma charla de WWDC donde encontré la gema acerca de que todos los métodos son opcionales, usan el encadenamiento opcional para llamar a un método opcional, y esto parece funcionar. La parte lamentable es que debes intentar llamar al método para saber si existe, lo que en el caso de registrarte para recibir notificaciones es un problema porque estás tratando de descubrir si este método existe antes de crear un Objeto UIUserNotificationSettings. Parece que llamar a ese método con nil está bien, así que la solución que parece estar funcionando para mí es:
Después de muchas búsquedas relacionadas con esto, la información clave vino de esta charla de WWDC https://developer.apple.com/videos/wwdc/2014/#407 justo en el medio en la sección sobre "Métodos opcionales en protocolos"
En Xcode 6.1 beta, el código anterior ya no funciona, el siguiente código funciona:
fuente
Si desea agregar soporte a IOS7 IOS8, puede aplicar este código en su proyecto.
fuente
Después de Xcode 6.1 Beta, el siguiente código funciona, una ligera edición en el código Tom S que dejó de funcionar con la versión 6.1 beta (funcionaba con la versión beta anterior):
fuente
Puedes usar esto
fuente
Swift 2.0
fuente
Si todo lo que necesita es el código ios 8, esto debería hacerlo.
fuente
Esta es una forma más limpia que estoy haciendo y simplemente funciona muy bien
fuente
para iOS 8 y superior
fuente