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

iOS 15下WKWebView生成PDF时不同路径PNG图片重复显示问题咨询

问题根本原因

这是iOS 15系统WebKit框架的已知原生BUG,核心是本地file协议PNG资源的缓存逻辑出错:
iOS 15为优化本地PNG加载速度,新增了PNG专用的内存缓存通道,该通道的缓存key生成逻辑存在缺陷,没有将文件完整路径纳入标识,而是仅用图像解码后的元数据(像素尺寸、色彩空间、像素哈希等)作为唯一判断依据。如果两张PNG的上述元数据相似度较高(比如是同尺寸的手绘图片、生成时使用了相同的图像配置),即便存储路径完全不同,WKWebView也会错误复用第一次加载的缓存资源,最终导致两个图片位展示同一张图。
你将图片转为JPG后问题消失,是因为JPG格式没有使用该新增的PNG专用缓存通道,仍然沿用旧版、以完整文件路径为缓存key的逻辑,所以不会出现缓存复用错误。
该BUG在iOS 15.4及以上系统版本已被苹果官方修复,如果你不需要兼容iOS 15.0~15.3版本,无需额外处理。

PNG场景下的修复方案

方案1:禁用WKWebView持久化缓存(优先推荐,改动最小)

初始化WKWebView配置时,使用非持久化的数据存储,直接禁用缓存逻辑,完全规避该问题:

let webConfiguration = WKWebViewConfiguration()
// 使用非持久化数据存储,不会缓存任何资源
webConfiguration.websiteDataStore = WKWebsiteDataStore.nonPersistent()

方案2:给图片路径添加唯一查询参数

填充HTML模板时,在图片路径末尾添加随机/唯一的查询参数,强制WebKit识别为不同资源,file协议的查询参数不会影响本地文件读取:

let timestamp = Int(Date().timeIntervalSince1970)
// 两张图片使用不同的参数即可,哪怕固定加后缀区分也生效
drawingPath1 = "file:///\(imageLocation)?t=\(timestamp)_1"
drawingPath2 = "file:///\(imageLocation)?t=\(timestamp)_2"

方案3:给PNG写入自定义元数据

生成PNG数据时,手动注入不同的自定义标识,破坏缓存匹配的条件:

import ImageIO

if let drawingImage = drawingImage, let cgImage = drawingImage.cgImage {
    let pngData = NSMutableData()
    guard let destination = CGImageDestinationCreateWithData(pngData, kUTTypePNG as CFString, 1, nil) else {
        // 降级使用原pngData()逻辑
        return
    }
    // 注入自定义唯一标识元数据
    let drawId = isDrawing1 ? "drawing_1" : "drawing_2"
    let properties = [kCGImagePropertyPNGDictionary: ["CustomDrawID": drawId]] as CFDictionary
    CGImageDestinationAddImage(destination, cgImage, properties)
    CGImageDestinationFinalize(destination)
    // 用生成的带自定义元数据的data写入文件即可
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:06:04