问题描述
在Xcode中尝试预览Widget(小组件),发现如下报错:
PotentialCrashError: BankletWidgetExtension may have crashed
BankletWidgetExtension may have crashed. Check ~/Library/Logs/DiagnosticReports for any crash logs from your application.
==================================
| [Remote] ArchivingError
|
| ArchivingError: imageTooLarge(size: (1024.0, 1024.0), maximumSize: (1042.8000000000002, 948.0))

经过排查发现,当隐藏背景照片代码时,Xcode不再报错:
Image("WidgetBackground")

但是这一报错也仅局限在Xcode预览中,真机上的小组件正常显示背景照片。

根据Xcode报错提示:
ArchivingError: imageTooLarge(size: (1380.0, 920.0), maximumSize: (1042.8000000000002, 948.0))
这表示Widget 使用的图片尺寸太大了,超出了 WidgetKit 支持的最大尺寸限制,从而导致了 Widget Extension 可能崩溃(PotentialCrashError)。
排查过程
因为WidgetKit支持的最大尺寸限制,我尝试使用frame缩小照片尺寸:
StaticConfiguration(kind: kind, provider: BankletWidgetProvider()) { entry in
BankletWidgetEntryView(entry: entry)
.containerBackground(for: .widget) {
Image("WidgetBackground")
.resizable()
.scaledToFit()
.frame(width: 100,height: 100)
}
}
尽管我尝试将frame尺寸设置为 100 * 100,但是Xcode预览仍然报错。

因此,怀疑Widget在渲染时,会根据这个照片的原始尺寸进行缩放,如果超过限制大小,就会触发崩溃。
当我检查原图尺寸时,发现原图尺寸为1024 * 1024,确实是超过了1042.8 * 948。

因此,我尝试修改资源文件夹中的照片尺寸为1042 * 948。

重新将修改后的照片拖动到资源文件夹后,Xcode预览恢复正常。

总结
之前配置小组件时,没有遇到过这种因为原图尺寸大小导致预览报错的问题。
因此,我判断是Xcode 16.3+,也就是最新的Xcode版本(2025年5月11日,16.3+)对Widget(小组件)的图像资源更严格限制,
在 Widget 中加载的所有图像都会经过预归档(Archiving)处理;
如果图像的原始尺寸超过 Apple 内部定义的最大渲染尺寸(如 1042×948),就会导致 ArchivingError: imageTooLarge;
这些限制的目标是为了适配 StandBy 模式、iPad 桌面小组件和 macOS Sonoma 桌面小组件,统一图像处理流程;
之前版本的 Xcode 对这个问题比较宽松,只在真机运行时才会偶发崩溃,现在连预览都强制检查。
在修改图片时,未必需要强制修改为1042.8 * 948,只需要设置宽度和高度小于这个范围即可。

通过resizable()和scaledToFill()等修饰符,可以实现填充的效果。
Image(entry.background)
.resizable()
.scaledToFill()
如果需要修改的图片过多,可以参考《macOS批量调整图片分辨率》一文,披露修改图片的分辨率。
相关文章
macOS批量调整图片分辨率:https://fangjunyu.com/2025/01/19/macos%e6%89%b9%e9%87%8f%e8%b0%83%e6%95%b4%e5%9b%be%e7%89%87%e5%88%86%e8%be%a8%e7%8e%87/