Что такое Silent Push Notification в iOS?

«Что такое Silent Push Notification в iOS?» — вопрос из категории Сети, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Silent Push Notification (Фоновое push-уведомление) — это специальный тип удаленного уведомления, который не отображает пользователю алерт, звук или бейдж. Его цель — незаметно уведомить приложение о необходимости обновить контент или выполнить фоновую задачу.

Как работает:

  1. Сервер отправляет push-запрос с payload, содержащим ключ "content-available": 1.
  2. Система iOS доставляет его приложению, даже если оно находится в фоновом режиме.
  3. Система временно пробуждает приложение (или дает фоновое время) для обработки.

Пример payload от сервера (JSON):

{
  "aps": {
    "content-available": 1,
    "sound": "" // Пустая строка для отключения звука (опционально)
  },
  "data": {
    "update_type": "new_messages",
    "timestamp": 1678886400
  }
}

Обработка в приложении (AppDelegate):

func application(_ application: UIApplication,
                 didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                 fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

    // 1. Проверяем, является ли уведомление фоновым
    guard let aps = userInfo["aps"] as? [String: Any],
          aps["content-available"] as? Int == 1 else {
        // Это обычное уведомление, обрабатываем иначе
        completionHandler(.noData)
        return
    }

    // 2. Извлекаем кастомные данные
    let updateType = (userInfo["data"] as? [String: Any])?["update_type"] as? String

    // 3. Выполняем фоновую задачу (например, загрузку новых данных)
    DispatchQueue.global().async {
        let success = self.syncNewMessagesFromBackend()

        // 4. Обязательно вызываем completionHandler с результатом!
        // Это сообщает системе об окончании работы и влияет на энергоэффективность.
        let result: UIBackgroundFetchResult = success ? .newData : .failed
        completionHandler(result)
    }
}

Критически важные ограничения и best practices:

  • Не гарантируется доставка: Система может откладывать или объединять фоновые пуши для оптимизации батареи.
  • Ограниченное время выполнения: На обработку дается примерно 30 секунд.
  • Частотные лимиты: Система накладывает нестрогие, но существующие лимиты на количество таких уведомлений.
  • Не работает, если приложение убито пользователем.
  • Всегда вызывайте completionHandler. Невызов приведет к завершению процесса приложения системой.

Типичные сценарии использования: Синхронизация новой почты, обновление ленты новостей, предзагрузка контента.