Closed arlovip closed 5 years ago
json格式肯定是需要parse的。获取不到具体是什么意思?
json格式肯定是需要parse的。获取不到具体是什么意思?
这样的,昨天我通过以下方式获取我自定义在metaInfo
里的force
字段:
我已经把打好的 ipa 包上传,热更新判断里面包含以下代码:
这里对metaInfo做解析,目的是解析出来之后获取metaInfo中的force字段对应的值
const metaInfoObj = JSON.parse(info.metaInfo);
if (metaInfoObj.force === 1) {
Alert.alert(isFirstTime + '提示1=' + metaInfoObj.force, '下载完毕,' + JSON.stringify(info), [
{text: '是', onPress: ()=>{switchVersion(hash);}},
{text: '否',},
{text: '下次启动时', onPress: ()=>{switchVersionLater(hash);}},
]);
} else {
Alert.alert(isFirstTime + '提示2=' + metaInfoObj.force, '下载完毕,' + JSON.stringify(info), [
{text: '是', onPress: ()=>{switchVersion(hash);}},
{text: '否',},
{text: '下次启动时', onPress: ()=>{switchVersionLater(hash);}},
]);
}
首先:发布第一个热更新版本,版本号为: 1.0.1 (原生的ipa包版本号为 1.0.0)
Enter meta info: {"force":1}
结果正常!
第二:修改 force 为 forceUpdate, 发布第二个热更新版本: 1.0.2
Enter meta info: {"forceUpdate":1}
结果:走了上面的 else, 也就是提示2 。 当再发布一次同样的内容时,才会走 if 里面,也就是提示1。
疑问:为什么不是立即生效,而是发布两次才生效?
第三:不修改force, 修改条件判断,即将 if (metaInfoObj.force === 1) { 修改为 if (metaInfoObj.force === 2) { 这里随便改成任意数据就行
Enter meta info: {"force":2}
结果: 同“第二”一样, 需要发布两次才生效。
第四:不修改Enter meta info: {"force":1}
Enter meta info: {"force":1}
这时是生效的,没有问题,假设现在热更新版本已经升级了2个版本,即现在 1.0.2, 接着再次升级,但是不输入任何metaInfo, 即:
.....
Enter meta info:
.......
结果:重启APP没有任何效果,既不走if 也不走 else, 也就是一直都没有 Alert 弹窗提示,版本维持在 1.0.2, 本应该升级到1.0.3的,所修改的版本号没有变化。
结论:
metaInfo中的值改变,改变之后的第一次升级获取的是上一次的值判断,第二次才正常
如果metaInfo不输入值(在判断中有metaInfo.force), 则不会走所有的判断(是因为JSON.parse解析问题?)
不知道以上这样解释是否详细,也不知道什么原因? 针对这几个问题已经测试过很多遍
- 基本的js语法问题。如果metaInfo不输入值(在判断中有metaInfo.force) 那么metaInfo为空, 访问空对象的属性会如何?显然会报错跳出执行
明白了,犯了2个低级错误:
没搞清热更新前后的代码业务逻辑变化,所以更改后没有生效
JSON.parse解析未catch error, 因为 JSON.parse("")会报错,没做好安全检查
另外也发现自己犯了一个错误,清理缓存功能的时候将沙盒路径缓存文件全都清空了,结果导致重启APP,所有的热更新版本都回退了,打算绕开热更新的缓存再对缓存做处理。
最后,非常感谢解答!(补基础知识去了/(ㄒoㄒ)/~~)
自定义了
metaInfo
字段如下, 无法获取到里面的force
字段:启动后的图:
获取:
也尝试通过
JSON.parse
和eval
解析,但是一直都是获取不到,请问怎么才能拿到自己定义的字段呢? 谢谢(试过几十次,各种都没效果,请指点下)