1

我向應用程序添加了UNNotificationServiceExtension,我成功獲取數據,並加載數據中的圖像以推送通知,但無法在推送通知窗口中顯示此圖像。請告訴我它是如何修復的?如何在UNNotificationServiceExtension中顯示圖像?

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 
          } 

回答

1

我做了這個以後,它爲我的作品

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 
    } 

} 
+1

嘗試這個現在這個樣子8小時,你的版本唯一終於工作的人......謝謝! –

0

這裏的工作代碼。同時驗證證書是否有效。我向你推薦ios10通知的RayWenderlich Screencasts。

嘗試刪除contentHandler時更改標題和正文和lastone

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