Lottie-ios v2.5.3 运行崩溃解决

314 阅读1分钟
Lottie-ios v2.5.3 运行崩溃解决
环境:MacOS 14.5、Xcode 15.4、OC项目
modelMap[layer.layerID] = layer;
Thread 1: "*** -[__NSDictionaryM setObject:forKeyedSubscript:]: key cannot be nil"
如图 运行时崩溃报错

1.png

排错过程:
google搜索 lottie-ios 2.5.3等,搜不出相关的信息,只好查源码。
排除资源问题:同样的lottie资源拉进新建的swift项目,pod install 最新版的Lottie-ios,运行正常。
用lldb 断点打印layer.layerID, 为nil
全局搜索layerID, 搜出这句
_layerID = [jsonDictionary[@"ind"] copy];

2.png

在lottie的资源文件中搜索ind,发现并非所有段落都包含"ind",所以layerID赋值时,jsonDictionary字典中取出ind为nil。
想到swift版的lottie版本没这个崩溃,便拉取了lottie-ios v4.5.0的源码,尝试搜索ind空值时的处理。

3.png

找到这个index,同文件里搜索index ,找到初始化那一行。

4.png

搜索layerID,已经找不到任何结果,可见swift版本的lottie已经把layerID给去除了,用原有的index来替代。

6.png

index在swift里的赋值是:取出ind,如果为空则赋值一个int随机数
相同,我们也可以在2.5.3版本的源码中做类似操作

拷贝如下

搜索
_layerID = [jsonDictionary[@"ind"] copy];
改成
NSNumber *ind;
if (jsonDictionary[@"ind"] == nil){
    ind =  [NSNumber numberWithInteger: arc4random()];
}else{
    ind = [NSNumber numberWithInteger:[jsonDictionary[@"ind"] intValue]];
 }
 _layerID = ind;
通过测试,没问题。
以上