Sobes.tech
Middle

Какво е разширение на услугата за известия?

sobes.tech AI

Отговор от AI

Разширението на службата за известия (Notification Service Extension) е малко изпълнимо допълнение, вградено във вашето iOS приложение. То позволява да се промени външният вид на съдържанието на отдалечено push известие преди неговото показване на потребителя.

Основни функции:

  • Модифициране на съдържанието: Промяна на заглавието, подзаглавието, текста или добавяне на прикачени файлове (изображения, видеа) към известието.
  • Декодиране на криптирани съдържания: Декодиране на криптирани данни, изпратени заедно с известието, преди да бъдат показани на потребителя.
  • Богати известия: В съчетание с разширението за съдържание на известия (Notification Content Extension), позволява създаването на персонализирани интерфейси за показване на известия.

Цикъл на живот:

  1. При получаване на отдалечено известие с ключ mutable-content: 1, системата инициира стартирането на разширението за известия.
  2. Извиква се методът didReceive(_:withContentHandler:), който обработва и модифицира известието.
  3. Модифицираното съдържание се предава на обработчика contentHandler.
  4. Системата показва модифицираното известие.

Ограничения:

  • Краткотрайно изпълнение (обикновено около 30 секунди).
  • Ограничен достъп до системните ресурси.
  • Не може да изпълнява дълги фонови задачи.

Пример за основна реализация:

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 {
            // Модифицирайте съдържанието на известието тук...
            bestAttemptContent.title = "\(bestAttemptContent.title ?? "Без заглавие") [променено]"

            contentHandler(bestAttemptContent)
        }
    }

    override func serviceExtensionTimeWillExpire() {
        // Извиква се точно преди разширението да бъде прекратено от системата.
        // Използвайте това като възможност да доставите "най-добрия" си опит за модифицирано съдържание,
        // иначе оригиналното натоварване на push ще бъде доставено.
        if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent {
            contentHandler(bestAttemptContent)
        }
    }

}