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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 18:47:22