iOS / FCM - 如何使用有效负载中的图像名称将 XCAsset 文件夹中的图像显示为通知附件?

2024-03-26

我正在为通过 FCM 发送的天气应用程序开发丰富通知。

首先,我想通知您,我的通知已通过 APNS 和 FCM 成功发送和接收。

我在用Pusher https://github.com/noodlewerk/NWPusher and Postman https://www.getpostman.com/为了测试一切。

CONTEXT

这是我发送的有效负载Postman

{
    "to": "/topics/03772",
    "content_available": true,
    "mutable_content": true,
    "priority": "high",

    "notification": {
        "title": "Daily forecast",
        "body": "Blue sky, no clouds",
        "sound": "default",
        "click_action": "weather"
    },
    "data": {
        "timestamp": "1506103200",
        "code": "03772",
        "city": "London",
        "attch": "7a",
        "t": "15˚",
    }
}

我喜欢这个Payload格式,我知道它有效,我感觉很清晰且易于理解。

说明:

用户可以通过将城市添加为收藏城市来订阅主题。主题是城市代码。

The data部分是服务器发送的天气数据。

这是我的didReceive方法 :

override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
    self.contentHandler = contentHandler
    bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)

    func failEarly() {
       contentHandler(request.content)
    }

    guard let content = (request.content.mutableCopy() as? UNMutableNotificationContent) else {
       return failEarly()
    }


    let attachment = try! UNNotificationAttachment(identifier: "image",
             url: Bundle.main.url(forResource: "12_c", withExtension: "png")!,
                                    options: nil)

    let category = UNNotificationCategory(identifier: "weather", actions: [], intentIdentifiers: [], options: [])

    UNUserNotificationCenter.current().setNotificationCategories([category])

    content.attachments = [attachment]

    contentHandler(content.copy() as! UNNotificationContent)
}

我直接使用 Bundle 中的图像名称进行测试,但它不起作用。

QUESTION

如何将 xcassets 文件夹中 UIImage 的 PNG 表示形式保存到磁盘?

事实上,键/值"attch": "7a"来自有效负载的天气图像的代码将作为附件显示在通知中。我已将所有图像保存在我的 xcassets 文件夹中(具有相同的代码名称)

我需要:

  • 获取通知中收到的图片名称
  • 获取 xcassets 文件夹中的关联图像
  • 将图像的 PNG 表示形式复制到 FileManager(磁盘)
  • 将其设置为通知的附件

编辑:解决了!

我的问题得到了解决,这要归功于另一个问题的答案,该问题甚至没有标记为已接受的答案,但它对我有帮助。

事实上,人们可能想做和我一样的事情,或者甚至没有考虑通知可以实现什么。

在我阅读的所有示例或指南中,他们解释了如何下载图像并将其设置为通知的附件。

但也可以使用 xcassets 文件夹中的本地图像来完成。 人们现在可以了解如何将其应用于此特定目的。

点赞数表明人们的情况和我一样,他们可能从这个问题/答案中学到了东西。

这是我的最终作品确实收到方法 :

override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {

        self.contentHandler = contentHandler
        bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)

        if let bestAttempContent = bestAttemptContent {
            // Modify the notification content here

            let userInfo : [AnyHashable: Any] = bestAttempContent.userInfo

            if let imgName = userInfo["attch"] {
                if let url = createLocalUrl(forImageNamed: imgName as! String) {
                    do {
                    let attachment = try UNNotificationAttachment(identifier: "weather", url: url, options: nil)
                        defer {
                            self.bestAttemptContent?.attachments = [attachment]
                        }
                    }
                    catch {
                        print("Could not set UNNotificationAttachment")
                    }
                }
            }

            contentHandler(bestAttempContent)
        }
    }

我在 SO 上找到的方法:

func createLocalUrl(forImageNamed name: String) -> URL? {

        let fileManager = FileManager.default
        let cacheDirectory = fileManager.urls(for: .cachesDirectory, in: .userDomainMask)[0]
        let url = cacheDirectory.appendingPathComponent("\(name).png")
        let path = url.path

        guard fileManager.fileExists(atPath: path) else {
            guard
                let image = UIImage(named: name),
                let data = UIImagePNGRepresentation(image)
                else { return nil }

            fileManager.createFile(atPath: path, contents: data, attributes: nil)
            return url
        }

        return url
    }

我希望它对你有帮助。


如果我正确的话,你会想使用attch属性的值作为图像名称,以从本地存储 (.xcassets) 形成 url。

负载内容是JSON,所以应该能够访问attch使用点语法:

let fileName: String = request.content.data.attch

然后形成资源的 URL 并将其附加。 (我假设它是“7a.jpg”)

if let url = Bundle.main.url(forResource: fileName, withExtension: "jpg") {
  //The Image exists
  let attachment = try! UNNotificationAttachment(identifier: "image",
         url: url, options: nil)
  content.attachments = [attachment]
} else {
  //Unable to get/find image, use a default one.

  let attachment = try! UNNotificationAttachment(identifier: "image",
         url: Bundle.main.url(forResource: "12_c", withExtension: "png")!, options: nil)
  content.attachments = [attachment]
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS / FCM - 如何使用有效负载中的图像名称将 XCAsset 文件夹中的图像显示为通知附件? 的相关文章

随机推荐

  • 等待 puppeteer 中的过渡结束

    我正在尝试使用 Puppeteer 测试网站 不幸的是 我在单击工具栏中的元素时遇到问题 工具栏使用 CSS 过渡来优雅地滑入页面 我的代码失败 因为我在页面仍在动画时单击元素将出现的位置 我使用超时作为解决方法 但必须有一个更优雅的解决方
  • 如何选择字段总和大于 MongoDB 中的值的位置

    使用 MongoDB 我将如何编写这个常规 SQL 语句 SELECT FROM table WHERE field1 field2 field3 gt 1 我一直在搞乱 group project add 等 我觉得我在围绕解决方案跳舞
  • 如何额外保护已使用 OAuth 2.0 访问令牌的 REST 服务?

    我有以下 REST 服务 An 聚合器暴露于外界的服务 它由用户 OAuth 2 0 访问令牌保护 这聚合器称为Internal服务 The Internal服务是在网络级别的not暴露于外界 它还由同一用户 OAuth 2 0 访问令牌保
  • 如何在 Delphi 中检测等宽字体?

    如何在 Delphi 中检测等宽字体 TFont Pitch应该fpFixed我想 但它对我来说不适用于 Delphi XE4 var Font TFont begin Font TFont Create Font Name Courier
  • Android 上的“上下文”是什么?

    在Android编程中 到底什么是Context类以及它的用途是什么 我在开发者网站 https d android com reference android content Context 但我无法清楚地理解它 简单来说 顾名思义 它是
  • Hibernate/JPA DB 架构生成最佳实践

    我只是想听听 Hibernate 专家关于基于 Hibernate JPA 的项目的数据库模式生成最佳实践的意见 尤其 项目刚开始时采用什么策略 是否建议让 Hibernate 在这个阶段自动生成架构 还是从项目的最早阶段手动创建数据库表更
  • 如何限制flatMap的并发数?

    我正在尝试使用 RxJS 编写一个脚本来处理数百个日志文件 每个日志文件大约 1GB 脚本的骨架看起来像 Rx Observable from arrayOfLogFilePath flatMap function logFilePath
  • matlab imagesc 背景颜色

    我正在使用最新版本的 matlab 我正在使用 imagesc 命令和 jet 颜色图绘制矩阵 矩阵的背景值为零 并在图像中绘制为颜色条上最低的颜色 即深蓝色 有没有办法使背景零值绘制为白色 Thanks j jet j 1 1 1 1 c
  • 从 AppDelegate 调用重新加载部分

    我正在构建一个应用程序来跟踪 BLE 设备 并且我有一个委托 在 appDelegate 中 来更新通过蓝牙发现的设备列表 我需要在表视图中显示这些设备 因此当我发现一个设备时 我会调用视图控制器中的一个函数来刷新表视图 如果我从 View
  • 根据文件扩展名打开语句

    我需要处理目录中的两种类型的文件 txt and gz 为此目的有两种类型的公开声明 gz files with gzip open file name rt encoding utf 8 as f line next f while li
  • e2e 测试 Angular UI 网格的规范方法

    故事 最近 我们的 UI 从自定义表格切换为角度 UI 网格 http ui grid info 随着它变得稳定且功能丰富 主 Angular UI 网格页面声称具有 e2e 测试集成 但我们很难让这项工作成功 据我们了解 e2e测试集成
  • 在Python中换行长行[重复]

    这个问题在这里已经有答案了 如何在 Python 中换行而不牺牲缩进 例如 def fun print 0 Here is a really long sentence with 1 format 3 5 假设这超出了建议的 79 个字符限
  • 以编程方式检测硬件呼叫/挂断键的存在

    我的一位客户想要一种返回布尔值的代码方法 如果 Android 手机有硬件红 绿呼叫 挂机键 则为 true 如果没有 则为 false 像这样的东西 public void keyFeedbackFromInput KeyEvent ev
  • 在 Android 中使用 Volley 解析 JSON 数据

    我尝试解析来自 的 JSON 数据https api instagram com v1 media popular client id https api instagram com v1 media popular client id 客
  • 如何挂钩异步 Backbone 事件来显示 HTML

    我想做的是调用数据库 然后以 HTML 形式显示结果 我一切正常 数据从数据库返回得很好 除了我无法弄清楚如何显示数据 我知道fetch 是异步的 但我不确定如何将其连接到我的集合视图中 这是我的骨干 function window App
  • 列出以特定字符开头的文件

    我有一个文件夹 其中包含以下名称的文件 5 45name Rdata and 15 45name Rdata 我只想列出以 5 开头的那些 在上面的示例中这意味着我想排除 15 45name Rdata Using list files p
  • silverlight DataGrid 中的复选框行为异常

    我在用checkbox in an itemtemplate中的列Silverlight 5 数据网格 我面临着一个奇怪的问题 当我选择多个时checkbox然后上下滚动网格 选择会转移到其他checkbox 我在代码中修复了这个问题 我在
  • Flutter/Dart 数量处理能力

    我是 Flutter 的新手 我想做一个输入量大的计算器 考虑每个数字 30 40 位 有人可以帮助我如何做到这一点吗 就像在 android 中我使用 BigDecimal 一样 Flutter 中的替代方案是什么 您可以使用decima
  • 根据传入的字符串设置枚举值

    我有许多需要枚举的设置方法 这些基于传入对象属性 有一种方法可以避免硬编码 10 种不同的 case 语句 而不是编写一堆这样的语句 有没有办法创建可重用的方法 Side class declared as public final enu
  • iOS / FCM - 如何使用有效负载中的图像名称将 XCAsset 文件夹中的图像显示为通知附件?

    我正在为通过 FCM 发送的天气应用程序开发丰富通知 首先 我想通知您 我的通知已通过 APNS 和 FCM 成功发送和接收 我在用Pusher https github com noodlewerk NWPusher and Postma