pantalla - Problema de notificación push con iOS 10
notificaciones push iphone instagram (6)
En iOS, la aplicación se acerca al cliente para obtener autorización para recibir advertencias
UIApplication
llamando a
registerUserNotificationSettings:
estrategia para la aplicación
UIApplication
.
La aplicación llama a
registerForRemoteNotifications:
técnica para
UIApplication
(iOS) o la estrategia
registerForRemoteNotificationTypes:
de
NSApplication
(OS X).
La aplicación ejecuta la
application:didRegisterForRemoteNotificationsWithDeviceToken:
técnica para
UIApplicationDelegate
(iOS) o
NSApplicationDelegate
(OS X) para obtener el token de dispositivo único producido por el beneficio push.
La aplicación ejecuta la
application:didFailToRegisterForRemoteNotificationsWithError:
técnica para
UIApplicationDelegate
(iOS) o
NSApplicationDelegate
(OS X) para obtener un error si la inscripción fracasó.
Desarrollé una aplicación en la que implementé la notificación push. Actualmente es en vivo en la tienda de Apple. Hasta iOS 9 push funciona bien, pero después de iOS 10 no funciona.
¿Cuál es el problema con el código?
La versión rápida 3 del código @Ashish Shah es:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
//notifications
if #available(iOS 10.0, *) {
let center = UNUserNotificationCenter.current()
center.delegate = self
center.requestAuthorization(options: [.sound, .alert, .badge]) { (granted, error) in
if error == nil{
UIApplication.shared.registerForRemoteNotifications()
}
}
} else {
// Fallback on earlier versions
}
return true
}
@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
}
@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
}
No olvide que, cuando realice la prueba, debe usar la dirección de
sandbox
para que sus notificaciones funcionen.
Para iOS 10 con xCode 8 GM.
He resuelto mi problema con los siguientes pasos con xCode 8 GM para iOS 10:
1) En los objetivos, en Capacidades, habilite las notificaciones automáticas para agregar derechos de notificaciones automáticas.
2) Implemente UserNotifications.framework en su aplicación. Importe UserNotifications.framework en su AppDelegate.
#import <UserNotifications/UserNotifications.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate,UNUserNotificationCenterDelegate>
@end
3) En el método didFinishLaunchingWithOptions, asigne
UIUserNotificationSettings
e implemente
UNUserNotificationCenter
delegado.
#define SYSTEM_VERSION_GRATERTHAN_OR_EQUALTO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
if(SYSTEM_VERSION_GRATERTHAN_OR_EQUALTO(@"10.0")){
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
center.delegate = self;
[center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error){
if( !error ){
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
}];
}
return YES;
}
4) Ahora finalmente implemente estos dos métodos de delegado.
// ============ Para iOS 10 =============
-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler{
//Called when a notification is delivered to a foreground app.
NSLog(@"Userinfo %@",notification.request.content.userInfo);
completionHandler(UNNotificationPresentationOptionAlert);
}
-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler{
//Called to let your app know which action was selected by the user for a given notification.
NSLog(@"Userinfo %@",response.notification.request.content.userInfo);
}
Mantenga el código tal como lo está utilizando para iOS 9, solo agregue líneas de código para admitir la notificación Push para iOS 10 utilizando UserNotifications.framework.
Tuve un problema con las notificaciones push silenciosas de iOS 10.
En iOS9 y versiones anteriores, el envío de una notificación push que tenía campos de datos adicionales pero tenía un atributo
aps
vacío en los datos funcionó bien.
Pero en iOS10, una notificación push con un atributo aps vacío no alcanza el método delegado de la aplicación didReceiveRemoteNotification, lo que significa que todas mis notificaciones push silenciosas (notificaciones que solo utilizamos internamente para activar acciones mientras la aplicación está abierta) dejaron de funcionar en iOS10.
Pude solucionar esto sin enviar una actualización a mi aplicación agregando al menos un atributo a la parte
aps
de la notificación push, en mi caso, simplemente agregué la
badge: 0
y mis notificaciones push silenciosas comenzaron a funcionar nuevamente en iOS 10. I ¡Espero que esto ayude a alguien más!