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

iOS端Lottie动画模拟器正常 加载时引发真机应用崩溃

问题根因

崩溃由两个问题共同导致:

  1. 核心诱因是资源加载失败:你看到的JSON解析错误说明真机运行时,App没有读到合法的Lottie动画JSON文件。*模拟器运行时会直接读取本地项目目录下的源文件,不会严格走打包后的资源读取规则,所以哪怕资源配置错误也大概率能正常加载;但真机运行时只能读取打包后写入沙盒的资源,一旦资源配置错误就会读到空数据或者被错误处理的非JSON内容,Lottie后续解析时访问非法内存地址,就触发了EXC_BAD_ACCESS崩溃。
  2. 你的LottieView实现存在生命周期缺陷:你把AnimationView初始化、约束添加、动画播放逻辑全写在了updateUIView方法中,这个方法会在SwiftUI视图每次刷新时重复调用,会反复创建添加子视图、重复触发动画加载,进一步放大崩溃概率。
修复步骤
  • 修正资源配置
    找到项目中导入的Lottie动画JSON文件,打开右侧文件检查器做如下检查:
    • 确认Target Membership板块下勾选了真机运行对应的App Target
    • 打开项目配置的Build Phases标签页,确认该JSON文件在Copy Bundle Resources列表中;同时检查Compile Sources列表,确保该JSON文件不在其中——JSON是静态资源,不能加入编译源列表参与编译,否则会被Xcode处理成非文本格式,真机读取时就会报JSON格式错误。
    • 如果之前导入文件时没有勾选Copy items if needed,建议删除现有引用,重新导入JSON文件,导入时勾选拷贝选项和对应Target。
  • 修正LottieView的实现逻辑
    将一次性的视图初始化逻辑移到makeUIView方法中,避免重复创建视图实例,参考实现如下:
import SwiftUI
import Lottie

struct LottieView: UIViewRepresentable {
    let animationName: String
    private let animationView = AnimationView()

    func makeUIView(context: Context) -> UIView {
        let container = UIView()
        // 仅做一次视图配置
        animationView.contentMode = .scaleAspectFit
        animationView.backgroundBehavior = .pauseAndRestore
        animationView.loopMode = .loop
        animationView.translatesAutoresizingMaskIntoConstraints = false
        
        container.addSubview(animationView)
        NSLayoutConstraint.activate([
            animationView.topAnchor.constraint(equalTo: container.topAnchor),
            animationView.leadingAnchor.constraint(equalTo: container.leadingAnchor),
            animationView.trailingAnchor.constraint(equalTo: container.trailingAnchor),
            animationView.bottomAnchor.constraint(equalTo: container.bottomAnchor)
        ])
        
        return container
    }

    func updateUIView(_ uiView: UIView, context: Context) {
        // 仅在动画未加载时加载并播放,避免重复触发
        guard animationView.animation == nil else { return }
        animationView.animation = Animation.named(animationName)
        animationView.play()
    }
}
  • 清理缓存重新编译
    按下Shift+Command+K清理Xcode构建缓存,删除真机上已经安装的旧版本App,重新编译安装即可正常加载动画。

补充说明:如果你使用的Lottie动画附带关联的图片资源,需要把图片和JSON文件放在同一个文件夹下,以蓝色文件夹(Folder References)的形式导入项目,或者将图片放入Xcode的Assets资源目录,否则真机上也会出现资源加载失败的问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 02:33:26