reactnativecn / react-native-pushy

React Native 极速热更新服务
https://pushy.reactnative.cn
Other
1.79k stars 259 forks source link

MetaInfo中自定义的字段怎么获取? #256

Closed arlovip closed 5 years ago

arlovip commented 5 years ago

自定义了metaInfo字段如下, 无法获取到里面的force字段:

Bundling with React Native version:  0.57.4
Loading dependency graph, done.
bundle: Writing bundle output to: /Users/langke/Developer/MyApp/build/intermedia/ios/index.bundlejs
bundle: Done writing bundle output
bundle: Copying 155 asset files
bundle: Done copying assets
Packing
Bundled saved to: build/output/ios.1556197336999.ppk
Would you like to publish it?(Y/N) y
  Uploading [============================================================================] 100% 0.0s
Enter version name: 2.1.59
Enter description: di 59
Enter meta info: {"force":1}
Version published: 61823

启动后的图:

metainfo error

获取:

info.metaInfo.force

也尝试通过JSON.parseeval解析,但是一直都是获取不到,请问怎么才能拿到自己定义的字段呢? 谢谢(试过几十次,各种都没效果,请指点下)

sunnylqm commented 5 years ago

json格式肯定是需要parse的。获取不到具体是什么意思?

arlovip commented 5 years ago

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的,所修改的版本号没有变化。

结论:

不知道以上这样解释是否详细,也不知道什么原因? 针对这几个问题已经测试过很多遍

sunnylqm commented 5 years ago
  1. 基本的逻辑应该不难理解吧?在switchVersion执行完之前都是旧代码(不然岂不是还没判断和执行就已经更新了?那还点是啊否的有何意义?)
sunnylqm commented 5 years ago
  1. 基本的js语法问题。如果metaInfo不输入值(在判断中有metaInfo.force) 那么metaInfo为空, 访问空对象的属性会如何?显然会报错跳出执行
arlovip commented 5 years ago
  1. 基本的js语法问题。如果metaInfo不输入值(在判断中有metaInfo.force) 那么metaInfo为空, 访问空对象的属性会如何?显然会报错跳出执行

明白了,犯了2个低级错误:

另外也发现自己犯了一个错误,清理缓存功能的时候将沙盒路径缓存文件全都清空了,结果导致重启APP,所有的热更新版本都回退了,打算绕开热更新的缓存再对缓存做处理。

最后,非常感谢解答!(补基础知识去了/(ㄒoㄒ)/~~)