使用 UNNotificationServiceExtension 进行丰富的远程通知

Posted

技术标签:

【中文标题】使用 UNNotificationServiceExtension 进行丰富的远程通知【英文标题】:Using UNNotificationServiceExtension for rich remote notifications 【发布时间】:2016-11-22 05:25:06 【问题描述】:

我正在尝试在 ios 10 中实现丰富的远程通知。我已经实现了这段代码。收到通知后的控件就到这里了,但是不知道怎么下载图片并在通知中显示。提前致谢。

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)

    if let bestAttemptContent = bestAttemptContent 
        // Modify the notification content here...
        //print("title for image = \(bestAttemptContent.title)")
        bestAttemptContent.title = "\(bestAttemptContent.title) [modified]"

        contentHandler(bestAttemptContent)
    





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)
    



【问题讨论】:

【参考方案1】:

您将在notificationData 中收到这样的附件

"attachment-url": "https://yourimage.png"

这就是你可以使用它的方式

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()
            
        

引用自here

【讨论】:

感谢您的回复@Rajat。我试过这个,但它仍然没有下载图像。仍然只显示文本数据。我不知道我做错了什么 检查文件是否正在下载,同时检查你是否从通知数据中获取了有效的url 是的,该网址有效。但是它们将存储在什么位置?我浏览了照片,没有。 您将图像保存在 NSTemporaryDirectory 临时目录中,而不是照片上 是的,但是我应该在哪个文件夹中搜索图像。如果我听起来很傻,我很抱歉。【参考方案2】:

终于开始工作了。这里的问题是我必须添加

NSAppTransportSecurity

扩展 plist 中的标记。添加此标签后,它开始显示图像。希望它可以帮助某人。

【讨论】:

以上是关于使用 UNNotificationServiceExtension 进行丰富的远程通知的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)