Rich Notification in swift. Image not show in notification

3.9k views Asked by At

I make rich notification to show image in notification but whenever i send simple message then i get notification. Last 2 day i am trying to show image in notification but it was not done. Please help me to do this.

Thank you in advance

This is my code.

In Notification Service Extension

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 data = request.content.userInfo["data"] as? [String: String] {
            // Grab the attachment
            if let urlString = data["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()
            }
        }

    }

This is my notification structure

{
 "aps" : {
    "alert" : {
        "title" : "Push Remote Rich Notifications",
        "subtitle" : "iOS 10 - New API",
        "body" : "Media Image Rich notification"
        },
    "mutable-content" : 1,
    "category" : "imageIdentifier"
    },
    "data" : {
      "attachment-url": "https://raw.githubusercontent.com/Sweefties/iOS10-NewAPI-UserNotifications-Example/master/source/iOS10-NewAPI-UserNotifications-Example.jpg"
    }
}
1

There are 1 answers

1
Ruchin Somal On

Use this following code

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)

     guard let bestAttemptContent = bestAttemptContent else {
         return
     }
     guard let attachmentUrlString = request.content.userInfo["pic_url"] as? String else {
         return
     }
     guard let url = URL(string: attachmentUrlString) else {
         return
     }

     URLSession.shared.downloadTask(with: url, completionHandler: { (optLocation: URL?, optResponse: URLResponse?, error: Error?) -> Void in
         if error != nil {
             print("Download file error: \(String(describing: error))")
             return
         }
         guard let location = optLocation else {
             return
         }
         guard let response = optResponse else {
             return
         }

         do {
             let lastPathComponent = response.url?.lastPathComponent ?? ""
             var attachmentID = UUID.init().uuidString + lastPathComponent

             if response.suggestedFilename != nil {
                 attachmentID = UUID.init().uuidString + response.suggestedFilename!
             }

             let tempDict = NSTemporaryDirectory()
             let tempFilePath = tempDict + attachmentID

             try FileManager.default.moveItem(atPath: location.path, toPath: tempFilePath)
             let attachment = try UNNotificationAttachment.init(identifier: attachmentID, url: URL.init(fileURLWithPath: tempFilePath))

             bestAttemptContent.attachments.append(attachment)
         }
         catch {
             print("Download file error: \(String(describing: error))")
         }

         OperationQueue.main.addOperation({() -> Void in
             self.contentHandler?(bestAttemptContent);
         })
     }).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)
     }
    }

also the following code in info.plist

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

add this key in NSExtension NSDictionary in Info.plist

    <key>NSExtensionAttributes</key>
    <dict/>