You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已开发静默消息通知的Notification Service Extension,能否发送图片等数据?

嗨,没问题!你完全可以通过Notification Service Extension实现带图片、联系人及位置信息的静默通知,不过得针对不同内容类型做对应的处理,同时注意APNs的一些规则,我给你详细拆解下:

核心实现方案

1. 图片内容的处理

要在通知里展示图片,核心是利用UNNotificationAttachment,步骤如下:

  • 首先确保推送Payload里包含**mutable-content:1**(触发Extension)、content-available:1(标记为静默通知),同时加自定义字段存储图片的HTTPS URL(APNs要求资源必须是HTTPS)。
  • 在Extension的didReceive(_:withContentHandler:)方法中,下载图片到临时目录,创建通知附件并添加到通知内容里。

举个Swift代码示例:

func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
    self.contentHandler = contentHandler
    guard let mutableContent = request.content.mutableCopy() as? UNMutableNotificationContent else {
        contentHandler(request.content)
        return
    }
    
    // 从payload的自定义字段获取图片URL
    guard let imageURLStr = mutableContent.userInfo["image_url"] as? String,
          let imageURL = URL(string: imageURLStr) else {
        contentHandler(mutableContent)
        return
    }
    
    // 下载图片到临时目录
    URLSession.shared.downloadTask(with: imageURL) { tempURL, _, error in
        guard let tempURL = tempURL, error == nil else {
            contentHandler(mutableContent)
            return
        }
        
        let fileManager = FileManager.default
        let tempDir = NSTemporaryDirectory()
        let fileName = imageURL.lastPathComponent
        let destURL = URL(fileURLWithPath: tempDir).appendingPathComponent(fileName)
        
        do {
            // 清理已存在的同名文件
            if fileManager.fileExists(atPath: destURL.path) {
                try fileManager.removeItem(at: destURL)
            }
            try fileManager.moveItem(at: tempURL, to: destURL)
            
            // 创建通知附件并添加
            let attachment = try UNNotificationAttachment(identifier: "image_attachment", url: destURL)
            mutableContent.attachments = [attachment]
            contentHandler(mutableContent)
        } catch {
            // 失败则返回原通知内容
            contentHandler(mutableContent)
        }
    }.resume()
}

⚠️ 注意:如果需要展示通知栏提醒,Payload里除了静默相关字段,还要添加alert字段(比如"alert": {"title": "新消息"}),否则系统只会后台触发Extension,不会弹出通知。

2. 联系人信息的处理

联系人信息有两种展示思路:

  • 直接展示:在Payload的alert字段(title/subtitle/body)里直接写入联系人的姓名、电话等信息,Extension可以读取自定义字段的详细数据,调整通知的展示格式(比如把邮箱放到subtitle)。
  • 系统级交互:提前注册UNNotificationCategory,给通知绑定联系人相关的快捷操作(比如“添加到通讯录”),Payload里指定category字段即可触发。

示例Payload:

{
  "aps": {
    "content-available": 1,
    "mutable-content": 1,
    "alert": {
      "title": "收到新联系人",
      "body": "张三"
    },
    "category": "contact_category"
  },
  "contact_info": {
    "name": "张三",
    "phone": "138xxxx1234",
    "email": "zhangsan@example.com"
  }
}

在Extension里可以读取contact_info,把mutableContent.subtitle设为"138xxxx1234 | zhangsan@example.com",让通知展示更完整的信息。

3. 位置信息的处理

位置信息的展示可以分两种场景:

  • 文字展示:在Payload的alert里直接写位置地址,自定义字段存经纬度,Extension可以调整格式,比如把经纬度放到subtitle。
  • 地图预览:通过地图API生成静态地图的HTTPS URL(比如根据经纬度生成一张缩略图),然后按照图片的处理方式,把静态地图作为通知附件添加,让用户直观看到位置。

示例Payload:

{
  "aps": {
    "content-available": 1,
    "mutable-content": 1,
    "alert": {
      "title": "好友共享位置",
      "body": "北京市朝阳区XX路XX号"
    }
  },
  "location_data": {
    "lat": 39.9042,
    "lng": 116.4074,
    "static_map_url": "https://example.com/map?lat=39.9042&lng=116.4074"
  }
}

你可以在Extension里下载static_map_url对应的图片,作为附件添加到通知里,实现地图预览效果。

关键注意事项
  • Extension运行限制:Extension的运行时长有限(约30秒),所以下载等操作要尽量高效,避免超时导致处理失败。
  • Payload大小限制:APNs的Payload不能超过4KB,所以要精简自定义字段的内容,图片URL尽量短(可以用短链接服务压缩)。
  • 沙盒隔离:Extension不能访问主App的沙盒,只能使用临时目录存储下载的文件,处理完成后系统会自动清理。

内容的提问来源于stack exchange,提问作者poojs followal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:57:49