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
相关产品推荐
相关产品推荐

