iOS 推送通知中的图像

Posted

技术标签:

【中文标题】iOS 推送通知中的图像【英文标题】:Images in iOS push notification 【发布时间】:2018-06-14 08:55:42 【问题描述】:

我正在尝试在推送通知中发送images 我已经在应用程序委托中进行了通知注册,并且 apns 设备令牌正在正确生成。 另外我在服务分机中编码如下:

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中的payload如下


    "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"
 

我收到了 titlemessage,但 image 没有收到。 请指导如何在推送通知中获取图像

【问题讨论】:

请将您的有效载荷密钥与代码匹配。检查代码中的Attachement-url 查看这个答案***.com/a/50523908/5084797。 你能用swift代码指导我吗?在推送通知中包含图像需要完成的所有过程 【参考方案1】:

对于 Swift,如果您愿意,可以尝试使用 this framework

还在您的应用中添加 "content-available":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
        
    

【讨论】:

你能帮我举一个 swift 中的实时示例以获取丰富的通知 你的意思是像一个Demo项目??从github.com/manishsharma93/BasicUtilityKit 开始尝试步骤,看看效果如何。【参考方案2】:

这一行:

if let urlString = notificationData["attachment-url"], let fileUrl = URL(string: urlString)

正在寻找 attachment-url 值作为 userInfo 字典中 data 对象的子对象。 它正在寻找这个:

 
    "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 的通知被传递!添加一个调用contentHandlerelse 来解决此问题。

一旦你下载了它,虽然还有另一个问题。 iOS 需要知道您在附件中放入了什么样的数据。附件选项字典允许您包含有关附件的类型信息。获取下载文件的 MIME 类型并从中创建统一类型标识符。然后可以在选项字典中使用统一类型标识符字符串。

我在iOS Notifications book 中深入介绍了所有这些内容。现在可用的示例章节处理向通知添加图像。

【讨论】:

以上是关于iOS 推送通知中的图像的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C 中的 iOS 10 富媒体推送通知(媒体附件)

带图像的 PHP-iOS 推送通知

在 iOS 10 中使用远程通知(富媒体推送通知)在通知栏中显示图像

在 ios sdk 中显示来自推送通知的图像

iOS Swift 使用 Firebase 云消息发送丰富的推送通知

iOS 丰富的推送通知设计