当前位置: 首页 > 面试题库 >

iOS推送通知中的图像

钦宏义
2023-03-14
问题内容

我正在尝试发送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中的有效负载如下

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

我收到 标题消息, 但是 图像 未显示。请指导如何在推送通知中获取图片


问题答案:

这行:

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

在userInfo字典中寻找attachment-url作为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。在这种情况下,您if let将不会被输入,并且contentHandler不会被调用!这不仅会导致服务扩展被锁定,还会阻止传递没有附件URL的任何通知!添加一个elsecontentHandler以解决此问题。

下载后,尽管存在另一个问题。iOS将需要知道您要在附件中放入哪种数据。附件选项字典允许您包括有关附件的类型信息。获取下载文件的MIME类型,然后从中创建一个统一类型标识符。然后,可以在选项字典中使用统一类型标识符字符串。

我将在iOS通知书中深入介绍所有这些内容。现在可用的示例章节涉及将图像添加到通知中。



 类似资料:
  • 我无法通过parse.com正确设置推送通知。我相信我的推送是因为它们通过解析显示在我的推送日志中。但是,无论我的推送发送到哪里(app或仪表盘),“发送的推送”总是显示0。我知道这可能是一个复杂的任务,所以任何帮助将是非常感谢!下面是我的代码: AppDelegate.m InboxTableViewController.m ViewDidLoad

  • 我用push notification与解析服务器连接了应用程序,但问题是我遇到了错误,它说:registerforRemotenotification类型在IOS 8.0版本中不推荐使用:请使用register for remote notification和register user notification设置。但这段代码是针对iOS8的。 有谁能帮我找到正确的代码吗?

  • iOS消息推送在工作灯,接收通知时,应用程序在后台作为徽章,但当我点击徽章也我得到有效载荷作为警报。我只需要徽章时,应用程序在后台运行。 实际上,我需要在应用程序位于前台时显示警报,如果应用程序位于后台,则显示徽章。在我的push received handler函数中,我正在检查这一点。但在ios中,只有当用户点击badge时,处理器函数get才会触发,而在Android中,当push收到时,处

  • 首先,我想声明我一直在研究推送通知和web通知之间的关系,但我有点困惑。 我从这里读到PWAs的推送通知在Safari上的iOS(iPhone)不起作用:从PWA向iOS发送推送通知 然而,如果iPhone用户使用的是Chrome,这是否意味着它们可以工作呢?或者推送通知在任何浏览器上对iPhone中的PWAs都不起作用? 这就把我带到了web通知。web通知在后台对PWAs起作用吗?我的问题是w

  • 本文向大家介绍iOS推送之本地通知UILocalNotification,包括了iOS推送之本地通知UILocalNotification的使用技巧和注意事项,需要的朋友参考一下 摘要: Notification是智能手机应用编程中非常常用的一种传递信息的机制,而且可以非常好的节省资源,不用消耗资源来不停地检查信息状态(Pooling),在iOS下应用分为两种不同的Notification种类,本

  • 我正在尝试用远程通知处理所有可能的情况。当调用Foreground-DidReceiverEmoteNotification中的app时我就ok了。问题是当应用程序处于后台状态时,我收到推送通知。什么都不叫。如何让用户知道他有新的远程通知当应用程序回到前台?