前凑,有一次拉旧代码运行看了一个问题后,再拉新代码进行直接崩溃,嗯??这是??看了看代码都正常,删了重新运行正常,先这样接着写吧。。。
现象:在appstore覆盖安装最新的版本App一打开就闪退,根本就无法使用。
寻找还没有升级手机观察下载过程,整个过程会Loading2次,第一次下载Loading完马上就到安装了,又会更新Loading一遍,第二次Loading过程比第一快。找好几个手机都是一样,但重新安装就正常了。
高高兴兴发布了新版本,用户覆盖升级竟然打开就闪退无法使用,大写的崩溃,像淘宝、支付宝、京东、微信、这样量级的App,发生这种事肯定是会上条头的,此时的心情是大写的崩溃。
定位问题,解决问题,我们使用了友盟和Bugly,先去搂一下崩溃日志,日志显示在读取用户缓存信息崩溃了,我在想不是我们新增了什么属性导致反序列化失败而崩溃。
拉上个版本的代码(还好打有tag)和当前版本代码比对,用户类属性竟然没有变化,蒙圈中。。。
上个版本的发布就是为了解决iOS 13.4中使用HandyJSON自动解析会崩溃的问题,当时解决的方案就是把崩溃的地方换成一个属性一个属性手动解析。
那现在的崩溃莫非是,因为我解析的方式不同,从而缓存到本地的数据也不同,自动解析和手动解析的对象不能相互反序列化??
经过修改代码测试,相同的手动或自动解析覆盖安装升级,新版本都无法反序列化还是一直崩溃崩溃。。。
后来把 let data = NSKeyedArchiver.archivedData(withRootObject: obj)这句代码查了一下,就查到一个17年帖子,意思就是遇到了 swift2 打包缓存的信息在 swift3 打的包时读取会崩溃,而且没有完美的解决,最后的决定只能是放弃这部分缓存。
我没有单独新建工程来验证这件事,我就先放弃缓存的用户信息,更新一下缓存用户信息的KEY值,整个工程除了用户信息有缓存以外,还有别的缓存,测试下不更新KEY值的缓存读取还是崩溃,那基本可以证明:
Swift 低版本缓存的数据,高版本无法反序列化。
可能这个结论不太准,但目前的现象的确如此,对了我还得说一下我的序列化/反序列化用的是NSCoding。
接二连三的连续更新,让我们的测试没有完全覆盖。
发的新版本计算商品数量有误,还好没有金钱损失,不幸中的万幸。
发现问题立即就定位到了,改好再发新版本。
这几天折腾的心累呀,希望大家不要再踩升级开发语言的坑。
网友评论