Sobes.tech
Назад к вопросам
Junior — Middle
73

Каким образом можно реализовать отправку push-уведомлений, включающих изображение?

Компании, где спрашивали
Т-БанкТ-Банк

Ответ от нейросети

sobes.tech AI

Для отправки push-уведомлений с изображением на iOS используется расширение уведомлений (Notification Service Extension). Оно позволяет перехватывать входящее уведомление, загружать изображение по URL и добавлять его в контент уведомления.

Основные шаги:

  1. Создать Notification Service Extension в проекте.
  2. В методе didReceive(_:withContentHandler:) расширения загрузить изображение из URL, переданного в payload уведомления.
  3. Создать UNNotificationAttachment с загруженным изображением.
  4. Добавить attachment к уведомлению и вызвать contentHandler.

Пример кода в Notification Service Extension:

override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
    self.contentHandler = contentHandler
    bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)

    guard let bestAttemptContent = bestAttemptContent,
          let urlString = bestAttemptContent.userInfo["image-url"] as? String,
          let url = URL(string: urlString) else {
        contentHandler(request.content)
        return
    }

    URLSession.shared.downloadTask(with: url) { (location, response, error) in
        if let location = location {
            let tmpDir = FileManager.default.temporaryDirectory
            let tmpFile = tmpDir.appendingPathComponent(url.lastPathComponent)
            try? FileManager.default.moveItem(at: location, to: tmpFile)

            if let attachment = try? UNNotificationAttachment(identifier: "image", url: tmpFile, options: nil) {
                bestAttemptContent.attachments = [attachment]
            }
        }
        contentHandler(bestAttemptContent)
    }.resume()
}

В payload push-уведомления нужно добавить ключ с URL изображения, например:

{
  "aps": {
    "alert": "Новое уведомление с изображением"
  },
  "image-url": "https://example.com/image.jpg"
}