0

我通过丰富的通知来显示通知中的图像,但每当我发送简单的消息,然后我收到通知。最后2天,我试图在通知中显示图片,但未完成。请帮助我做到这一点。swift丰富的通知。图像没有在通知中显示

预先感谢您

这是我的代码。

在通知服务扩展

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

    } 

这是我的通知结构

{ 
"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" 
    } 
} 
+0

从DOC:“您的延伸部具有的时间(不超过30秒)来修改内容并执行contentHandler时块一个有限的量。如果您没有及时执行该模块,系统会调用您的扩展的serviceExtensionTimeWillExpire方法,为您提供最后一次执行该模块的机会。如果你不这样做,系统会向用户显示通知的原始内容。“你是否陷入这种情况? – Larme

+0

我认为不,我不能管理....但我立即收到通知,但图像不显示 – Mohit

+0

有你找到你的解决方案,我陷入了同样的境地 – riddhi

回答

0
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) 
     } 
    } 

也info.plist中

下面的代码

在NSExtension NSDictionary中添加此键中的Info.plist

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