Flutter iOS应用推送通知无法显示图片问题求助
Flutter iOS推送通知图片不显示问题排查
下面是针对你遇到的问题的具体排查步骤:
1. 验证Notification Service Extension的代码逻辑
确保Extension的NotificationService.swift里正确实现了图片下载和附件添加逻辑,示例代码如下:
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) guard let bestAttemptContent = bestAttemptContent, let imageUrlString = bestAttemptContent.userInfo["image_url"] as? String, let imageUrl = URL(string: imageUrlString) else { contentHandler(request.content) return } URLSession.shared.downloadTask(with: imageUrl) { [weak self] tempFileUrl, response, error in guard let self = self, let tempFileUrl = tempFileUrl, error == nil else { contentHandler(bestAttemptContent) return } let fileManager = FileManager.default let folderUrl = fileManager.containerURL(forSecurityApplicationGroupIdentifier: "你的AppGroupID") let fileUrl = folderUrl?.appendingPathComponent("notification_image.jpg") do { if fileManager.fileExists(atPath: fileUrl!.path) { try fileManager.removeItem(at: fileUrl!) } try fileManager.moveItem(at: tempFileUrl, to: fileUrl!) if let attachment = try? UNNotificationAttachment(identifier: "image", url: fileUrl!, options: nil) { bestAttemptContent.attachments = [attachment] } } catch { print("处理图片附件出错: \(error)") } contentHandler(bestAttemptContent) }.resume() } override func serviceExtensionTimeWillExpire() { if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent { contentHandler(bestAttemptContent) } } }
注意:
- 必须配置App Group,并在主App和Extension的Signing & Capabilities中添加对应的App Group,否则Extension无法和主App共享文件。
- 图片URL必须为HTTPS协议(iOS默认禁止HTTP资源,若需使用HTTP需在Info.plist中配置
NSAppTransportSecurity例外规则)。
2. 检查推送Payload的格式
通过Firebase发送推送时,必须确保APNs payload包含mutable-content: 1,否则系统不会触发Notification Service Extension。正确的Firebase payload示例:
{ "to": "设备令牌", "notification": { "title": "测试通知", "body": "带图片的通知" }, "data": { "image_url": "https://example.com/valid-image.jpg" }, "apns": { "payload": { "aps": { "mutable-content": 1 } } } }
若通过Firebase控制台发送,需在Additional options的APNs payload中手动添加{"aps": {"mutable-content": 1}},同时在Custom data中添加image_url字段及对应图片地址。
3. 验证Extension的配置
- 检查Extension的Deployment Target是否与主App一致,不能高于主App的iOS版本。
- 确认Extension的Signing配置正确,使用与主App相同的团队证书,且已开启App Group(若代码中用到)。
- 检查Extension的Info.plist中
NSExtension字段配置是否正确:
<key>NSExtension</key> <dict> <key>NSExtensionAttributes</key> <dict> <key>UNNotificationExtensionCategory</key> <string></string> <key>UNNotificationExtensionInitialContentSizeRatio</key> <real>0.5</real> </dict> <key>NSExtensionMainStoryboard</key> <string>MainInterface</string> <key>NSExtensionPointIdentifier</key> <string>com.apple.usernotifications.service</string> </dict>
4. 调试Extension的运行状态
在Xcode中选择Extension的target,连接真实设备后点击运行,发送推送通知时断点会触发到didReceive方法,可检查:
- 是否进入Extension代码逻辑(若未进入,说明
mutable-content未配置正确,或Extension签名存在问题)。 - 图片URL是否正确解析,下载过程中是否出现报错。
- 附件是否成功添加到
bestAttemptContent中。
5. 其他注意事项
- 图片大小不能超过10MB,否则会被系统忽略。
- 图片格式需为iOS支持的类型(JPG、PNG、GIF等)。
- 若图片URL存在重定向,需确保URLSession能自动处理(默认支持简单重定向,复杂重定向需手动处理)。
内容的提问来源于stack exchange,提问作者WhisperingWinds
相关产品推荐
相关产品推荐

