关于第一次打开游戏,访问本地存储出错的问题 setStorageSync:fail

在做微信小游戏,然后,游戏中设置了复活卡,存储在本地;同时,设置了音量开关,控制是否开启音乐,也是存储在本地。然后出现一个问题,应用在第一次启动的时候,部分安卓手机会出现崩溃的问题,报错如下,不知道是否有人遇到过相同的问题,如果有人遇到过,那是怎么解决的?希望论坛里的大牛们帮忙解决一下,谢谢了!!!

cocos2dx debug:复活卡数为:

gameThirdScriptError
APP-SERVICE-SDK:setStorageSync:fail;at setTimeout callback function
Error: APP-SERVICE-SDK:setStorageSync:fail
at new t (:203:20397)
at c (:205:20047)
at Function.y.(anonymous function) (:205:21590)
at Object. (:202:24133)

cocos2dx debug:本地读取的音量为

gameThirdScriptError
APP-SERVICE-SDK:setStorageSync:fail;at requestAnimationFrame callback function
Error: APP-SERVICE-SDK:setStorageSync:fail
at new t (:203:20397)
at c (:205:20047)
at Function.y.(anonymous function) (:205:21590)
at Object. (:202:24133)

1赞

这个问题出现概率多高?设置的数据是多大,有没有超过微信的接口限制?可以提供个demo分析吗?

设置的数据量很小,只有不到10个key-value,而且存储的都是0和1,,小米6和三星galaxy5出现概率特别高。

他们说下一个版本修复

但是下个版本是什么时候,也没说。。

请耐心等待。

这个问题出现的频率非常高,安卓三星s8+几乎比现,我上微信开发者社区看,好像一直没解决。

可以尝试try机制,重新写入试试,我没重现过,所以没法验证这个方法。

统一回复大家一下,这个问题我后来解决掉了,解决方式如下:

  1. 我们在保存数据到本地的时候,默认是调用了cocos的方法cc.sys.localStorage.setItem(key,value)方法来进行保存数据操作。
  2. 仔细看报错信息,报错是setStorageSync:fail,而这个方法是微信的报错。这个setStorageSync方法是setStorage的同步版本,仔细看这个方法的使用方式是wx.setStorageSync(string key, Object|string data),该方法和cocos提供的保存数据的方法cc.sys.localStorage.setItem(key,value)的格式是一样的,因此猜测,cocos底层是调用的这个方法。
  3. 微信还提供了另外一个数据保存的方式,即wx.setStorage(Object object),改方法是异步保存的。该方法的使用见微信官方 https://developers.weixin.qq.com/minigame/dev/document/storage/wx.setStorage.html
  4. 这个是微信底层的bug,所以,为了规避这个问题,推荐对平台进行判断,如果当前平台是微信小游戏,就调用wx.setStorage方法。为了方便使用,最好的办法是自己封装一个方法。然后对平台的判断逻辑,和区分区里的逻辑,都写在这个方法中。
  5. 以上是解决方案,亲测管用。
1赞

我们也是用的楼上方法,线上后台出了大量setStorageSync:fail日志,微信官方的建议也是尽量使用异步接口,不过也建议cocos是不是也提供一个cc.sys.localStorage.setItemAyn这样的异步接口,这样,用户就不用去关心底层到底是调用的谁的接口呢。

APP-SERVICE-SDK:setStorageSync:fail;at requestAnimationFrame callback function
Error: APP-SERVICE-SDK:setStorageSync:fail
这个是图片

以上方法管用,:+1: