Sobes.tech
Middle

Czym jest rozszerzenie usługi powiadomień?

sobes.tech AI

Odpowiedź od AI

Rozszerzenie usługi powiadomień (Notification Service Extension) to małe, wykonywalne uzupełnienie zintegrowane z Twoją aplikacją iOS. Pozwala na zmianę wyglądu treści zdalnego powiadomienia push przed jego wyświetleniem użytkownikowi.

Główne funkcje:

  • Modyfikacja treści: Zmiana tytułu, podtytułu, tekstu lub dodanie załączników (obrazów, wideo) do powiadomienia.
  • Odszyfrowanie zaszyfrowanej treści: Odszyfrowanie danych zaszyfrowanych wysłanych razem z powiadomieniem przed ich wyświetleniem użytkownikowi.
  • Rozbudowane powiadomienia: W połączeniu z rozszerzeniem treści powiadomień (Notification Content Extension) umożliwia tworzenie niestandardowych interfejsów do wyświetlania powiadomień.

Cykl życia:

  1. Po otrzymaniu zdalnego powiadomienia z kluczem mutable-content: 1, system inicjuje uruchomienie rozszerzenia usługi powiadomień.
  2. Implementowana jest metoda didReceive(_:withContentHandler:), w której następuje przetwarzanie i modyfikacja powiadomienia.
  3. Zmieniona treść jest przekazywana do obsługi końcowej contentHandler.
  4. System wyświetla zmodyfikowane powiadomienie.

Ograniczenia:

  • Krótkotrwałe wykonanie (zwykle około 30 sekund).
  • Ograniczony dostęp do zasobów systemowych.
  • Nie może wykonywać długotrwałych zadań w tle.

Przykład podstawowej implementacji:

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 {
            // Modyfikuj treść powiadomienia tutaj...
            bestAttemptContent.title = "\(bestAttemptContent.title ?? "Brak tytułu") [zmodyfikowany]"

            contentHandler(bestAttemptContent)
        }
    }

    override func serviceExtensionTimeWillExpire() {
        // Wywoływane tuż przed zakończeniem działania rozszerzenia przez system.
        // Użyj tego jako okazji do dostarczenia "najlepszej próby" zmodyfikowanej treści,
        // w przeciwnym razie zostanie dostarczony oryginalny ładunek push.
        if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent {
            contentHandler(bestAttemptContent)
        }
    }

}