Изображения в push-уведомлениях iOS
Я пытаюсь отправить images
в push-уведомлениях я произвел регистрацию уведомлений в приложении делегат, и токен устройства apns генерируется правильно. ТАКЖЕ я написал код службы ext следующим образом:
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)
// Get the custom data from the notification payload
if let notificationData = request.content.userInfo["data"] as? [String: String] {
// Grab the attachment
if let urlString = notificationData["attachment-url"], let fileUrl = URL(string: urlString) {
// Download the attachment
URLSession.shared.downloadTask(with: fileUrl) { (location, response, error) in
if let location = location {
// Move temporary file to remove .tmp extension
let tmpDirectory = NSTemporaryDirectory()
let tmpFile = "file://".appending(tmpDirectory).appending(fileUrl.lastPathComponent)
let tmpUrl = URL(string: tmpFile)!
try! FileManager.default.moveItem(at: location, to: tmpUrl)
// Add the attachment to the notification content
if let attachment = try? UNNotificationAttachment(identifier: "", url: tmpUrl) {
self.bestAttemptContent?.attachments = [attachment]
}
}
// Serve the notification content
self.contentHandler!(self.bestAttemptContent!)
}.resume()
}
}
}
}
, И полезная нагрузка в JSON выглядит следующим образом
{
"aps":
{"sound":"default","alert":
{"title":"iOS","body":"Hello Dude...."},
"mutable-content": 1},
"CustomData":
{"mType":"alert","m":"Hello Dude...."},
"Attachement-url":"https://pusher.com/static_logos/320x320.png"
}
Я получаю заголовок и сообщение, но изображение не приходит. Пожалуйста, руководство, как получить изображение в push-уведомлениях
2 ответа
Для Swift, если вы хотите, вы можете попробовать с этим фреймворком
Также добавьте "контент-доступно":1 в ваших апс
ИЛИ вы можете попробовать скачать, как это,
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
self.contentHandler = contentHandler
bestAttemptContent = (request.content.mutableCopy() as?UNMutableNotificationContent)
bestAttemptContent?.title = request.content.title
bestAttemptContent?.body = request.content.body
guard let content = (request.content.mutableCopy() as? UNMutableNotificationContent) else {
return failEarly()
}
guard let payload = content.userInfo["CustomData"] as? [String: Any] else {
return failEarly()
}
guard let attachmentURL = payload["Attachement-url"] as? String else {
return failEarly()
}
let identifierName = getIdentifierName(fileURL: attachmentURL)
let tmpSubFolderName = ProcessInfo.processInfo.globallyUniqueString
guard let imageData = NSData(contentsOf:NSURL(string: attachmentURL)! as URL) else { return failEarly() }
guard let attachment = UNNotificationAttachment.create(imageFileIdentifier: identifierName, data: imageData, options: nil, tmpSubFolderName: tmpSubFolderName) else { return failEarly() }
content.attachments = [attachment]
contentHandler(content.copy() as! UNNotificationContent)
}
}
func getIdentifierName(fileURL : String) -> String {
var identifierName : String = "image.jpg"
if !fileURL.isEmpty() {
identifierName = "file.\((fileURL as NSString).lastPathComponent)"
}
return identifierName
}
func failEarly() {
if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent {
contentHandler(bestAttemptContent)
}
}
extension UNNotificationAttachment {
static func create(imageFileIdentifier: String, data: NSData, options: [NSObject : AnyObject]?, tmpSubFolderName : String) -> UNNotificationAttachment? {
let fileManager = FileManager.default
let tmpSubFolderName = ProcessInfo.processInfo.globallyUniqueString
let fileURLPath = NSURL(fileURLWithPath: NSTemporaryDirectory())
let tmpSubFolderURL = fileURLPath.appendingPathComponent(tmpSubFolderName, isDirectory: true)
do {
try fileManager.createDirectory(at: tmpSubFolderURL!, withIntermediateDirectories: true, attributes: nil)
let fileURL = tmpSubFolderURL?.appendingPathComponent(imageFileIdentifier)
try data.write(to: fileURL!, options: [])
let imageAttachment = try UNNotificationAttachment.init(identifier: imageFileIdentifier, url: fileURL!, options: options)
return imageAttachment
} catch let error {
print("error \(error)")
}
return nil
}
}
Эта строка:
if let urlString = notificationData["attachment-url"], let fileUrl = URL(string: urlString) {
Ищет attachment-url
значение как ребенок data
Объект в словаре userInfo. Он ищет это:
{
"aps" : {
...
},
"data" : {
"attachment-url" : "some url"
}
}
Но полезная информация в вашем вопросе такова:
{
"aps":{
"sound":"default",
"alert": {
"title":"iOS",
"body":"Hello Dude...."
},
"mutable-content": 1
},
"CustomData": {
"mType":"alert",
"m":"Hello Dude...."
},
"Attachement-url":"https://pusher.com/static_logos/320x320.png"
}
Раздел "данные" не существует, а attachment-url
Ключ не существует.
Измените код Swift так, чтобы он соответствовал содержимому полезной нагрузки, и вы сможете получить URL-адрес изображения и загрузить его.
У вас будут большие проблемы, если вы получите уведомление, в котором нет URL-ключа вложения или URL-адрес вложения не является правильно сформированным URL-адресом. В этих случаях ваш if let
не будет введен и contentHandler
не будет называться! Это не только приведет к блокировке расширения службы, но и предотвратит доставку любого уведомления, в котором отсутствует URL-адрес вложения! Добавить else
что вызывает contentHandler
чтобы исправить это.
Как только вы загрузили его, возникла другая проблема. iOS нужно будет знать, какие данные вы помещаете во вложение. Словарь опций вложений позволяет включать информацию о типе вложений. Получите MIME-тип загруженного файла и создайте из него унифицированный идентификатор типа. Строка Uniform Type Identifier может затем использоваться в словаре опций.
Я расскажу обо всем этом подробно в книге уведомлений iOS. Доступный образец главы посвящен добавлению изображений в уведомления.