es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La propiedad UIApplication.applicationIconBadgeNumber debe ser utilizada solo desde el hilo principal.

Estoy usando la actualización de insignias de localización, donde se establece el número de insignias en Configuración de notificaciones a continuación. Se lee ‘UIApplication.shared.applicationIconBadgeNumber’ como número de insignia y aparece el mensaje de advertencia de Xcode ‘UIApplication.applicationIconBadgeNumber debe usarse solo en el hilo principal’ al ejecutarlo.

Tengo dos preguntas:

1) ¿Cómo puedo suprimir esta advertencia o implementarla correctamente para que no se muestre?

2) Al usar notificación de localización para desencadenar el número de insignia, el número de insignia mostrado puede no ser correcto si hay cancelación/cambios en la notificación, o la segunda notificación programada llega antes que la primera. ¿Existe alguna manera de establecer y actualizar correctamente los números de insignias cuando se activan localmente?

let addRequest = {
let notificationContent = UNMutableNotificationContent()
notificationContent.title = "Título de prueba"
notificationContent.subtitle = "Subtítulo de prueba"
notificationContent.body = "Cuerpo de prueba"
notificationContent.sound = content.sound
// ************* Se advierte el hilo principal para esta línea *************
notificationContent.badge = NSNumber(value: UIApplication.shared.applicationIconBadgeNumber + 1)
// **************************************************************************
DispatchQueue.main.async {
UIApplication.shared.applicationIconBadgeNumber += 1
}

Tags:  , ,

Answer

  1. Avatar for davy.ai
    1. Para manejar correctamente la advertencia de UIApplication.applicationIconBadgeNumber solo debe ser utilizado desde el hilo principal, puedes envolver la llamada dentro de DispatchQueue.main.async para asegurarte de que se ejecute en el hilo principal, como sigue:
    notificationContent.badge = NSNumber(value: DispatchQueue.main.sync {
        UIApplication.shared.applicationIconBadgeNumber + 1 
    })
    

    Esto suprimirá la advertencia y asegurará que el número del distintivo se actualice en el hilo principal.

    1. Para asegurarse de que el número del distintivo se muestre correctamente, puedes usar UNNotificationServiceExtension para manejar la notificación y actualizar el número del distintivo. Cuando un usuario recibe una notificación, la extensión de servicio se llama primero, y puedes usar esto para modificar el contenido de la notificación antes de que se entregue.

    Dentro de UNNotificationServiceExtension, puedes usar el objeto UNNotification para acceder al contenido de la notificación original y actualizar el número del distintivo según sea necesario, basado en tu lógica de negocio personalizada. Por ejemplo, puedes usar la propiedad UNNotificationRequest.content para acceder al contenido de la notificación y actualizar el número del distintivo según ciertas condiciones.

    Aquí hay un ejemplo:

    override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
        // Obtén el contenido original, modifica el número del distintivo según sea necesario y pásalo a contentHandler
        let modifiedContent = request.content.mutableCopy() as! UNMutableNotificationContent
        modifiedContent.badge = updateBadgeNumberForNotification(request.content)
        contentHandler(modifiedContent)
    }
    
    func updateBadgeNumberForNotification(_ notificationContent: UNNotificationContent) -> NSNumber {
        // Aplica tu lógica de negocio personalizada para calcular el nuevo número del distintivo y devuélvelo como NSNumber
        return NSNumber(value: newBadgeNumber)
    }
    

    Esto asegura que el número del distintivo se actualice correctamente, incluso si hay cambios o cancelaciones en la notificación.

Comments are closed.