Sobes.tech
Middle

O que é uma extensão do serviço de notificações?

sobes.tech IA

Resposta da IA

A extensão do serviço de notificações (Notification Service Extension) é um pequeno complemento executável integrado na sua aplicação iOS. Permite modificar a aparência do conteúdo de uma notificação push remota antes de a exibir ao utilizador.

Funções principais:

  • Modificação de conteúdo: Alterar o título, subtítulo, texto ou adicionar anexos (imagens, vídeos) à notificação.
  • Decifrar conteúdo encriptado: Decifrar dados encriptados enviados juntamente com a notificação antes de os mostrar ao utilizador.
  • Notificações enriquecidas: Em combinação com a extensão de conteúdo de notificações (Notification Content Extension), permite criar interfaces personalizadas para a exibição de notificações.

Ciclo de vida:

  1. Ao receber uma notificação remota com a chave mutable-content: 1, o sistema inicia a execução da extensão do serviço de notificações.
  2. Implementa-se o método didReceive(_:withContentHandler:), no qual ocorre o processamento e modificação da notificação.
  3. O conteúdo alterado é passado para o manipulador de finalização contentHandler.
  4. O sistema exibe a notificação modificada.

Restrições:

  • Execução de curta duração (geralmente cerca de 30 segundos).
  • Acesso limitado a recursos do sistema.
  • Não pode realizar tarefas prolongadas em segundo plano.

Exemplo de implementação básica:

import UserNotifications

class NotificationService: UNNotificationServiceExtension {

    var contentHandler: ((UNNotificationContent) -> Void)?
    var bestAttemptContent: UNMutableNotificationContent?

    override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
        self.contentHandler = contentHandler
        bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)

        if let bestAttemptContent = bestAttemptContent {
            // Modificar o conteúdo da notificação aqui...
            bestAttemptContent.title = "\(bestAttemptContent.title ?? "Sem Título") [modificado]"

            contentHandler(bestAttemptContent)
        }
    }

    override func serviceExtensionTimeWillExpire() {
        // Chamado pouco antes de a extensão ser terminada pelo sistema.
        // Use isto como uma oportunidade para entregar a sua "melhor tentativa" de conteúdo modificado,
        // caso contrário, será entregue a carga útil original.
        if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent {
            contentHandler(bestAttemptContent)
        }
    }

}