push notification - remote - Manejo de notificaciones de usuario en iOS 10
push notifications ios swift tutorial (3)
Estábamos enfrentando el mismo problema aquí y solo pudimos resolver este problema en la versión iOS 10 GM utilizando el código en la respuesta que se da aquí: https://forums.developer.apple.com/thread/54332
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
NSOperatingSystemVersion version = [[NSProcessInfo processInfo] operatingSystemVersion];
if (version.majorVersion == 10 && version.minorVersion == 0) {
[self application: application
didReceiveRemoteNotification: userInfo
fetchCompletionHandler: ^(UIBackgroundFetchResult result) {
}];
}
Con esta corrección, nuestro código comenzó a funcionar nuevamente tanto en iOS 9 como en 10.
También tuvimos que cambiar la forma en que manejamos el comportamiento del estado de la aplicación (UIApplicationStateActive, UIApplicationStateInactive y UIApplicationStateBackground) en las notificaciones push, ya que parece que también cambió en iOS 10
EDITAR :
- Parece que el comportamiento del estado de la aplicación ha vuelto a la normalidad en las últimas versiones de iOS 10.
Tengo problemas para determinar cuándo el usuario toca una notificación push de usuario en iOS 10.
Hasta ahora, he estado usando la -[UIApplicationDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:]
que se llama cuando
-
Case 1
: la aplicación está activa y se recibe el empuje -
Case 2
: cuando el usuario lanzó la aplicación después de grabar una notificación recibida
Este método comenta explícitamente
Tenga en cuenta que este comportamiento está en contraste con la aplicación: didReceiveRemoteNotification :, que no se llama en esos casos y que no se invocará si se implementa este método.
Todo este trabajo como se esperaba
Ahora iOS 10 desaprobó este método de delegado e introdujo el marco de UserNotification
que no puedo usar porque todavía estoy apuntando a iOS 8 y 9.
Cuando mi aplicación se ejecuta en iOS 10 y se recibe una inserción mientras la aplicación está activa ( Case 1
), se llama correctamente a la -[AppDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:]
.
De nuevo en iOS 10, cuando el usuario inicia la aplicación tocando una notificación ( Case 2
), este método no se llama .
Me doy cuenta de que cuando implemente el anterior -[UIApplicationDelegate application:didReceiveRemoteNotification:]
es el que se llama en el Case 2
En iOS 8 y 9, en el Case 2
es el -[AppDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:]
Se llama al método -[AppDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:]
.
¿Significa que tengo que actualizar mi aplicación e implementar el delegado anterior solo para iOS 10?
Entonces, la pregunta es, ¿cuál es la implementación adecuada del manejo de la interacción del usuario de una inserción recibida en iOS 10 sin usar el marco de UserNotification
?
vítores, Jan
Esto ha sido arreglado en iOS 10.1 Beta 1 !!
La -[UIApplicationDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:]
se llama correctamente cuando el usuario toca una notificación.
Swift code para iOS 10:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
if #available(iOS 10.0, *) {
let center = UNUserNotificationCenter.currentNotificationCenter()
center.delegate = self
}
// ...
return true
}
@available(iOS 10.0, *)
func userNotificationCenter(center: UNUserNotificationCenter, didReceiveNotificationResponse response: UNNotificationResponse, withCompletionHandler completionHandler: () -> Void) {
print(response.notification.request.content.userInfo)
}
@available(iOS 10.0, *)
func userNotificationCenter(center: UNUserNotificationCenter, willPresentNotification notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void) {
print(notification.request.content.userInfo)
}