已开发静默消息通知的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
相关产品推荐
相关产品推荐

