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:
- Po otrzymaniu zdalnego powiadomienia z kluczem
mutable-content: 1, system inicjuje uruchomienie rozszerzenia usługi powiadomień. - Implementowana jest metoda
didReceive(_:withContentHandler:), w której następuje przetwarzanie i modyfikacja powiadomienia. - Zmieniona treść jest przekazywana do obsługi końcowej
contentHandler. - 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)
}
}
}