如何在 UNNotificationServiceExtension 中显示图像?
How to show image in UNNotificationServiceExtension?
我在应用程序中添加了UNNotificationServiceExtension
,我成功获取了数据,并将数据中的图像加载到推送通知中,但是我无法在推送通知中显示该图像window。请告诉我如何修复它?
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
self.contentHandler = contentHandler
bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
if let bestAttemptContent = bestAttemptContent {
// Modify the notification content here...
bestAttemptContent.title = "Apple [modified]"
bestAttemptContent.body = "Xcode"
contentHandler(bestAttemptContent)
let attachmentStorage = AttachmentStorage()
if let imagePath = request.content.userInfo["image"] as? String {
guard let url = URL(string: imagePath) else {
contentHandler(bestAttemptContent)
return
}
debugPrint("url", url)
attachmentStorage.store(url: url) { (localURL, error) in
if let localURL = localURL {
debugPrint("path", localURL)
do {
let attachment = try UNNotificationAttachment.init(identifier: "image", url: localURL, options: nil)
bestAttemptContent.attachments = [attachment]
debugPrint("bestAttemptContent.attachments", bestAttemptContent.attachments, bestAttemptContent.attachments.count)
contentHandler(bestAttemptContent)
return
} catch {
contentHandler(bestAttemptContent)
return
}
}
}
}
contentHandler(bestAttemptContent)
}
}
class AttachmentStorage {
func store(url: URL, completion: ((URL?, Error?) -> ())?) {
// obtain path to temporary file
let filename = ProcessInfo.processInfo.globallyUniqueString
let path = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("\(filename).jpeg")
// fetch attachment
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
do {
let _ = try data?.write(to: path)
completion?(path, error)
} catch {
debugPrint(error.localizedDescription)
completion?(nil, error)
}
}
task.resume()
}
}
日志
"bestAttemptContent.attachments" [<UNNotificationAttachment: 0x14dd626c0; identifier: image, family: Image, URL: file:///private/var/mobile/Containers/Data/PluginKitPlugin/1F13F774-B6CA-4567-9EF0-EA61C9A1F2A0/tmp/23A8E7EC-29FB-4C36-893D-5B0DCFB711B2-13808-000002A699FBF67B.jpeg, type: public.jpeg, options: <UNImageNotificationAttachmentOptions: 0x14dd5afd0>>] 1
我添加了这段代码。即使您删除了 contentHandler,有时您也会得到重复项或没有图像
let request = UNNotificationRequest.init(identifier: "image", content: bestAttemptContent, trigger: nil)
UNUserNotificationCenter.current().add(request) { (error) in
// handle error
}
这里是工作代码。还要验证证书是否有效。我向您推荐 ios10 通知的 RayWenderlich 截屏视频。
尝试在更改 title 和 body 以及 lastone 后删除 contentHandler
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
self.contentHandler = contentHandler
bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
if let bestAttemptContent = bestAttemptContent {
var attachmentString = ""
if let bigImage = bestAttemptContent.userInfo["gcm.notification.bigImage"] as? String {
attachmentString = bigImage
}
if attachmentString != "", let attachmentUrl = URL(string: attachmentString)
{
let session = URLSession(configuration: URLSessionConfiguration.default)
let attachmentDownloadTask = session.downloadTask(with: attachmentUrl, completionHandler: { (url, response, error) in
if let error = error {
print("Error downloading attachment: \(error.localizedDescription)")
} else if let url = url {
let attachment = try! UNNotificationAttachment(identifier: attachmentString, url: url, options: [UNNotificationAttachmentOptionsTypeHintKey : kUTTypePNG])
bestAttemptContent.attachments = [attachment]
}
contentHandler(bestAttemptContent)
})
attachmentDownloadTask.resume()
}
}
}
override func serviceExtensionTimeWillExpire() {
// Called just before the extension will be terminated by the system.
// Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent {
contentHandler(bestAttemptContent)
}
}
这是我做的,对我有用
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
self.contentHandler = contentHandler
bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
if let bestAttemptContent = bestAttemptContent {
// Modify the notification content here...
if let imagePath = request.content.userInfo["image"] as? String {
guard let url = URL(string: imagePath) else {
contentHandler(bestAttemptContent)
return
}
guard let imageData = NSData(contentsOf: url) else {
contentHandler(bestAttemptContent)
return
}
guard let attachment = UNNotificationAttachment.create(imageFileIdentifier: "image.jpg", data: imageData, options: nil) else {
print("error in UNNotificationAttachment.create()")
contentHandler(bestAttemptContent)
return
}
bestAttemptContent.attachments = [ attachment ]
}
contentHandler(bestAttemptContent)
}
}
extension UNNotificationAttachment {
/// Save the image to disk
static func create(imageFileIdentifier: String, data: NSData, options: [NSObject : AnyObject]?) -> UNNotificationAttachment? {
let fileManager = FileManager.default
let tmpSubFolderName = ProcessInfo.processInfo.globallyUniqueString
guard let tmpSubFolderURL = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(tmpSubFolderName, isDirectory: true) else { return nil }
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(identifier: imageFileIdentifier, url: fileURL, options: options)
return imageAttachment
} catch let error {
print("error \(error)")
}
return nil
}
}
我在应用程序中添加了UNNotificationServiceExtension
,我成功获取了数据,并将数据中的图像加载到推送通知中,但是我无法在推送通知中显示该图像window。请告诉我如何修复它?
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
self.contentHandler = contentHandler
bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
if let bestAttemptContent = bestAttemptContent {
// Modify the notification content here...
bestAttemptContent.title = "Apple [modified]"
bestAttemptContent.body = "Xcode"
contentHandler(bestAttemptContent)
let attachmentStorage = AttachmentStorage()
if let imagePath = request.content.userInfo["image"] as? String {
guard let url = URL(string: imagePath) else {
contentHandler(bestAttemptContent)
return
}
debugPrint("url", url)
attachmentStorage.store(url: url) { (localURL, error) in
if let localURL = localURL {
debugPrint("path", localURL)
do {
let attachment = try UNNotificationAttachment.init(identifier: "image", url: localURL, options: nil)
bestAttemptContent.attachments = [attachment]
debugPrint("bestAttemptContent.attachments", bestAttemptContent.attachments, bestAttemptContent.attachments.count)
contentHandler(bestAttemptContent)
return
} catch {
contentHandler(bestAttemptContent)
return
}
}
}
}
contentHandler(bestAttemptContent)
}
}
class AttachmentStorage {
func store(url: URL, completion: ((URL?, Error?) -> ())?) {
// obtain path to temporary file
let filename = ProcessInfo.processInfo.globallyUniqueString
let path = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("\(filename).jpeg")
// fetch attachment
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
do {
let _ = try data?.write(to: path)
completion?(path, error)
} catch {
debugPrint(error.localizedDescription)
completion?(nil, error)
}
}
task.resume()
}
}
日志
"bestAttemptContent.attachments" [<UNNotificationAttachment: 0x14dd626c0; identifier: image, family: Image, URL: file:///private/var/mobile/Containers/Data/PluginKitPlugin/1F13F774-B6CA-4567-9EF0-EA61C9A1F2A0/tmp/23A8E7EC-29FB-4C36-893D-5B0DCFB711B2-13808-000002A699FBF67B.jpeg, type: public.jpeg, options: <UNImageNotificationAttachmentOptions: 0x14dd5afd0>>] 1
我添加了这段代码。即使您删除了 contentHandler,有时您也会得到重复项或没有图像
let request = UNNotificationRequest.init(identifier: "image", content: bestAttemptContent, trigger: nil)
UNUserNotificationCenter.current().add(request) { (error) in
// handle error
}
这里是工作代码。还要验证证书是否有效。我向您推荐 ios10 通知的 RayWenderlich 截屏视频。
尝试在更改 title 和 body 以及 lastone 后删除 contentHandler
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
self.contentHandler = contentHandler
bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
if let bestAttemptContent = bestAttemptContent {
var attachmentString = ""
if let bigImage = bestAttemptContent.userInfo["gcm.notification.bigImage"] as? String {
attachmentString = bigImage
}
if attachmentString != "", let attachmentUrl = URL(string: attachmentString)
{
let session = URLSession(configuration: URLSessionConfiguration.default)
let attachmentDownloadTask = session.downloadTask(with: attachmentUrl, completionHandler: { (url, response, error) in
if let error = error {
print("Error downloading attachment: \(error.localizedDescription)")
} else if let url = url {
let attachment = try! UNNotificationAttachment(identifier: attachmentString, url: url, options: [UNNotificationAttachmentOptionsTypeHintKey : kUTTypePNG])
bestAttemptContent.attachments = [attachment]
}
contentHandler(bestAttemptContent)
})
attachmentDownloadTask.resume()
}
}
}
override func serviceExtensionTimeWillExpire() {
// Called just before the extension will be terminated by the system.
// Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent {
contentHandler(bestAttemptContent)
}
}
这是我做的,对我有用
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
self.contentHandler = contentHandler
bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
if let bestAttemptContent = bestAttemptContent {
// Modify the notification content here...
if let imagePath = request.content.userInfo["image"] as? String {
guard let url = URL(string: imagePath) else {
contentHandler(bestAttemptContent)
return
}
guard let imageData = NSData(contentsOf: url) else {
contentHandler(bestAttemptContent)
return
}
guard let attachment = UNNotificationAttachment.create(imageFileIdentifier: "image.jpg", data: imageData, options: nil) else {
print("error in UNNotificationAttachment.create()")
contentHandler(bestAttemptContent)
return
}
bestAttemptContent.attachments = [ attachment ]
}
contentHandler(bestAttemptContent)
}
}
extension UNNotificationAttachment {
/// Save the image to disk
static func create(imageFileIdentifier: String, data: NSData, options: [NSObject : AnyObject]?) -> UNNotificationAttachment? {
let fileManager = FileManager.default
let tmpSubFolderName = ProcessInfo.processInfo.globallyUniqueString
guard let tmpSubFolderURL = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(tmpSubFolderName, isDirectory: true) else { return nil }
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(identifier: imageFileIdentifier, url: fileURL, options: options)
return imageAttachment
} catch let error {
print("error \(error)")
}
return nil
}
}