unresolved tutorial notification enable ios swift push-notification swift4 unusernotificationcenter

ios - tutorial - UIApplication.registerForRemoteNotifications() debe llamarse solo desde el hilo principal



push notifications ios swift tutorial (7)

Xcode 9 (iOS 11) me muestra un error / advertencia al registrarse para la notificación Push (remota).

Aquí hay un mensaje de error

Y aquí está el código, lo he intentado:

let center = UNUserNotificationCenter.current() center.delegate = self center.requestAuthorization(options: [.sound, .alert, .badge]) { (granted, error) in if error == nil{ UIApplication.shared.registerForRemoteNotifications() } }

Línea de error / advertencia:

UIApplication.shared.registerForRemoteNotifications ()

¿Cómo resolver esto?


El mensaje de error es bastante claro: despache registerForRemoteNotifications al hilo principal.

Usaría el parámetro granted y manejaría el error consecuencia

center.requestAuthorization(options: [.sound, .alert, .badge]) { (granted, error) in if granted { DispatchQueue.main.async { UIApplication.shared.registerForRemoteNotifications() } } else { print(error!) // handle the error } }


En swift4

Puedes resolver este problema con

DispatchQueue.main.async(execute: { UIApplication.shared.registerForRemoteNotifications() })

Espero que esto ayude ...


Espero que esto ayude

DispatchQueue.main.async(execute: { UIApplication.shared.registerForRemoteNotifications() })


Esta también es la forma correcta de hacerlo en Swift 4.0

UNUserNotificationCenter.current().delegate = self UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.sound,.badge], completionHandler: {(granted,error) in if granted{ DispatchQueue.main.async { application.registerForRemoteNotifications() } } })


Esto es lo que funcionó para mí. Cortesía de @ Mason11987 en el comentario aceptado arriba.

DispatchQueue.main.async() { code }


Para el objetivo C, el siguiente código funciona

dispatch_async(dispatch_get_main_queue(), ^{ [[UIApplication sharedApplication] registerForRemoteNotifications]; });


TL; DR:
Todas las manipulaciones de la interfaz de usuario deben realizarse en el subproceso principal para evitar problemas. Si no puede hacerlo, Main Thread Checker (función de depuración recientemente introducida en XCode 9) producirá problemas en tiempo de ejecución. Así que envuelva su código en el bloque Main Thread como se muestra a continuación para evitar fallas y advertencias de tiempo de ejecución.

DispatchQueue.main.async { UIApplication.shared.registerForRemoteNotifications() }

En lanzamientos de Xcode antes de ver. 9, las advertencias relacionadas con el hilo principal se imprimirían en el área de la consola textualmente. De todos modos, puede deshabilitar opcionalmente ( no es un enfoque recomendado ) el Comprobador de subprocesos principales en la configuración de diagnóstico en Editar esquema .


Explicación:

Apple introdujo una nueva opción de depuración en XCode 9 para verificar problemas en tiempo de ejecución para UIKit y otras API que manipulan elementos de la interfaz de usuario. Si hay algún cambio en los elementos de la interfaz de usuario de la API de UIKit en tiempo de ejecución, sin un bloque de subprocesos principal, es muy probable que cause fallas y fallas de la interfaz de usuario. El Comprobador de subprocesos principales está habilitado de forma predeterminada para detectar esos problemas en tiempo de ejecución. Puede deshabilitar el Comprobador de subprocesos principales en la ventana Editar esquema , como se muestra a continuación, aunque en realidad no se recomienda hacerlo:

Si tiene SDK o Frameworks anteriores, al actualizar a Xcode 9, es posible que se enfrente a esta advertencia, ya que algunas de las llamadas al método UIKit no se habrían incluido en Main Thread. Actualizarlos a la última versión solucionaría el problema (si el desarrollador lo sabe y lo solucionó).

Cita de las notas de la versión beta de XCode 9:

  • Nuevo en Xcode 9 - Comprobador de subprocesos principales.
    • Habilite la detección del uso indebido de la API de la interfaz de usuario desde el hilo de fondo
    • Detecta llamadas a métodos AppKit, UIKit y WebKit que no se realizan en el hilo principal.
    • Se habilita automáticamente durante la depuración y se puede deshabilitar en la pestaña Diagnóstico del editor de esquemas.
    • Main Thread Checker funciona con los lenguajes Swift y C.