【问题标题】:Rich Notification in swift. Image not show in notification快速丰富的通知。图片未显示在通知中
【发布时间】:2018-02-23 01:51:53
【问题描述】:

我制作了丰富的通知以在通知中显示图像,但每当我发送简单消息时,我都会收到通知。前 2 天我试图在通知中显示图像,但没有完成。请帮我做这件事。

提前致谢

这是我的代码。

在通知服务扩展中

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

【问题讨论】:

  • 来自文档:“您的扩展程序有有限的时间(不超过 30 秒)来修改内容并执行 contentHandler 块。如果您不及时执行该块, "你属于那种情况吗?
  • 我认为不,我无法做到这一点....但我会立即收到通知,但图像不显示。
  • 你找到解决方案了吗?我也陷入了同样的境地。
  • 尝试可以在几秒钟内下载的非常小的图像。您使用的图片尺寸非常大。
  • 你好@KrishnaDattShukla。使用 7 kb 大小的图像但仍无法获取图像

标签: ios swift3 notifications apple-push-notifications rich-notifications


【解决方案1】:

使用以下代码

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 中的以下代码

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

在 Info.plist 中的 NSExtension NSDictionary 中添加这个键

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

【讨论】:

  • 我什么都试过了,但didReceive没有任何理由?
猜你喜欢
  • 1970-01-01
  • 2018-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-01
  • 2020-03-24
  • 2021-09-12
  • 1970-01-01
相关资源
最近更新 更多