Hybrid使用localStorage储存数据不可靠

在Hybrid做App,需要保存一些数据在本地,一般会使用HTML5的特性localStorage和sessionStorage,具体的介绍请看这里

本文的重点不在于介绍localStorage,而是通过我的遭遇侧重描述为什么HybridApp的数据存储在localStorage不可靠…

我先来描述一下场景,我是负责用HTML5也就是Hybrid做iOS开发的,在9月底,最近发布了一个新版本后,陆陆续续发现有几个使用iOS用户告知的一个现象,说每次使用App都需要重新登录!用户的描述是,登录以后,当天杀掉进程是不会再使用App是不用重新登录的,但是过几天以后,再使用App就会要重新登录;

在定位问题的时候,我通常会要按照以下几个步骤:

  1. 出现该bug的用户是大面积的群体还是个别几个
  • 群体性:很大可能是代码问题,或者服务器问题,因为使用的是同一个App,同一个服务器接口或者同一个服务器的访问地址;
  • 个别几个:很可能与用户的行为,场景有关,在某些特别的时候,就会触发App出现某个bug;
  1. 出现该bug的用户是否存在类似相似的地方:如果存在相似的地方,那就模仿用户的操作,或者模拟用户的场景,尽量复现问题;
  2. 出现该问题的逻辑:检查这块逻辑代码,是否存在出现问题的可能,调试与模仿用户的操作;

首先,这个“重新登录”的问题不是群发性的因为这几位用户分布在全球,并且这个问题,我们按照用户的操作在测试手机上怎么测试都没有复现;

第二,这个问题出现是个别几个不一样的用户,都是普遍的登录操作,没有任何移异常的地方;
第三,我十分明确我代码“登录”这块逻辑的数据存储是保存在localStorage上的,在启动App的时候去检查localStorage是否存在用户登录的数据,如果不存在,则重新登录,并且在日志中,我发现不单单是登录数据被清除,是所有存储在localStorage都没有了,包括一系列初始化需要保存的数据。

综上所述,我基本能得到一个初步结果:在某些特定的情况下,localStorage被清除了!

为了进一步确定某些特定的情况下,我想象过许多可能性

  1. 由于App9月底发布新版本的时候,Apple公司刚刚发布iOS10,并且在App日志中能明显发现的是,出现该问题的大部分是iOS10的用户!并且在google中也能发现类似的言论!这里,难道与iOS10系统有关?直到我发现一位用户用的是iOS8,我才彻底推翻这个想法;
  2. 是不是我代码中,调用了localStorage.clear()方法,强制的清空了所有内存?然后我搜索的所有代码,并没有!
  3. 是不是手机启用的App太多,导致系统内存(RAM)不足,然后强制清除了呢?为了实现这个想法,我在手机中安装了好几个大型游戏,把手机都玩得烫的不要不要的,也没有出现;

在纠结了半天后,在google得到了一个重大发现, 这里;这篇文章中,描述了,在iOS8中,当系统空间不足的时候,系统会清除localStorage中的数据!

得知这个消息后,我马上安排测试的小伙伴去测试,先登录App,然后多下点应用,把空间使用完;

然后我打电话咨询了两位客户,得到的消息是,这两位客户,手机空间经常不足,最直观的表现是微信经常提醒要清理空间,他们用的都是16G的iPhone手机!打完电话回到座位,测试的小伙伴兴奋的说,复现了复现了,当内存不足的时候,系统那里会出现个什么正在清除数据…
然后,打开App后,就发现数据被清空了。

所以,出现问题的原因是,当系统存储空间不足时,会触发系统级别的清理,并且清除一些资源,其中就有localStorage;

这就是这个奇妙之旅。所以,localStorage存储数据,在iOS中确实不可靠!在iOS系统中这个localStoreage不是一种持久化的数据!虽然这个不是App引发的问题,但是,这个问题还是得解决!后面如果找到了解决方案,再一篇文章做做记录呗….

另外,本文仅描述iOS,在找资料的同时,也相关的资料说,localStorage在Android同样不可靠,但是我没实测,具体请看这里;

参考资料:
https://forum.ionicframework.com/t/iOS-localstorage-persistence/20004/17
http://gonehybrid.com/dont-assume-localstorage-will-always-work-in-your-hybrid-App/
https://forum.ionicframework.com/t/ionic-1-iOS-10-local-storage-issue/63519