Ответ
Silent Push Notification (Фоновое push-уведомление) — это специальный тип удаленного уведомления, который не отображает пользователю алерт, звук или бейдж. Его цель — незаметно уведомить приложение о необходимости обновить контент или выполнить фоновую задачу.
Как работает:
- Сервер отправляет push-запрос с payload, содержащим ключ
"content-available": 1. - Система iOS доставляет его приложению, даже если оно находится в фоновом режиме.
- Система временно пробуждает приложение (или дает фоновое время) для обработки.
Пример 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. Невызов приведет к завершению процесса приложения системой.
Типичные сценарии использования: Синхронизация новой почты, обновление ленты новостей, предзагрузка контента.