您的位置:

全面了解React Native CodePush

一、CodePush 回滚

1、如果在CodePush发布后发现某个版本存在问题,我们可以使用CodePush回滚功能。
2、在回滚前,需要先生成新版本发布,将有问题的版本下线。

//生成新版本发布
code-push release-react MyApp ios -d production
//将有问题的版本下线
code-push promote MyApp-OldProduction ios -r Production
//回滚到上一个版本
code-push rollback MyApp ios Production
3、回滚成功后,用户会强制离线,并且,当他们再次打开应用时,将看到指定版本的更新提示。如果你想在回滚时保留部分用户的更新,请使用--targetBinaryVersion参数,例如: --targetBinaryVersion 1.0.0

二、CodePush 更新没效果

1、如果在发布应用更新后用户并未收到更新,这个问题通常是由以下原因导致的:
- 应用安装方式有误,例如在应用安装时未给予正确的访问权限; - 对于已签名和已发布的应用,应用的版本号及签名存在问题; - 应用使用了未发布的更新版本; - CodePush服务无法连接。
2、如果是随机的更新没有生效,可以试试重启设备或者清空缓存。

三、CodePush 如何打包

1、在使用React Native CodePush时,我们需要对应用进行打包,示例如下:

//进行生产环境的打包
react-native bundle --platform ios --entry-file index.ios.js --bundle-output ./ios/main.jsbundle --dev false
2、打包生成的main.jsbundle文件需要在本地引用。为了方便操作,我们可以在Xcode中的Build Phases选项卡下添加一个Run Script,示例如下:
    # 在运行前先清空之前的构建生成目录
    rm -rf "${SRCROOT}/../CodePush"
    # 执行 react-native 命令生成JsBundle文件到指定目录
    react-native bundle --platform ios --entry-file index.ios.js --bundle-output "${SRCROOT}/../CodePush/main.jsbundle" --dev false --assets-dest "${SRCROOT}/../"

    # 删除文件中字符串中的空格
    sed -i "" 's/ *$//g' "${SRCROOT}/../CodePush/main.jsbundle"

    # 验证是否存在文件
    if [ ! -f "${SRCROOT}/../CodePush/main.jsbundle" ]
    then
    echo "main.jsbundle not found!"
    exit 1
    else
    echo "main.jsbundle is found."
    fi
3、最后,在Xcode中将链接的JavaScript库指向main.jsbundle即可。

四、CodePush 服务迁移

1、如果你想从一个CodePush服务迁移到另一个CodePush服务,可以参考以下步骤: - 在第二个CodePush服务中新建应用,并将新应用的名称在原先应用的配置文件中替换; - 停止第一个CodePush服务的向应用推送更新,等所有设备轮询到新应用名称后,开始在第二个CodePush服务中发布更新。 2、在此过程中,用户需要重新下载应用,或者检查更新从第二个服务中获取更新。

五、CodePush 苹果上架审核

1、如果使用了CodePush,请在苹果上架审核中填写以下说明: - 该应用使用了Microsoft App Center CodePush移动应用更新; - App Store Review Guidelines规定,所有应用程序都必须由苹果公司直接审批,并且不能在应用内部进行部分更新(指软件的核心功能)。 2、当你成功提交应用后,更新内容将会弹出。如果你需要更新的是应用的核心功能,苹果会要求你进行重新提交审核。不过,CodePush更新不会涉及核心功能,所以能够通过审核。

六、CodePush 更新ram-bundle

1、在发布时,需要将生产环境下JS代码包压缩成一个单一的文件。您可以通过将ram-bundle忽略选项添加到发布脚本中,来禁用此功能。

//忽略打包
code-push release-react MyApp ios --disable-delta --dev false --pre-json {\"buildNumber\": \"$(theme_version)\"} --description "Updating MyApp to version $$(theme_version)" -t [email list]
2、这将禁用使用IncDelta更新生产应用程序时额外的ODR网络请求。

七、CodePush 苹果热更新审核

1、苹果热更新审核需要使用CodePush的“与源文件比较”功能,并将所有JS代码打包到一个文件中。 2、使用以下命令对应用程序进行打包并在发布时禁用增量更新。

//忽略增量更新,更新全部JS文件
code-push release-react MyApp ios --disable-delta --dev false --pre-json {\"buildNumber\": \"$(theme_version)\"} --description "Updating MyApp to version $$(theme_version)" -t [email list]
3、如果您没有像上面这样,用--disable-delta标记禁用增量更新,则热更新审核将不会因为增量更新失败而被阻止。

八、CodePush 升级之后路径不见了

1、如果你在应用升级后出现路径不见(path not found)的错误,请确保协调好Incremental更新和JSBundleURI之间的关系,确保都在应用的设置中反映。 2、可以使用下面的代码获取BundleURL:

import { NativeModules } from 'react-native';
const { CodePush } = NativeModules;
CodePush.getConfiguration((error, config) => {
    console.log(config);
});
3、如果以上方法无法解决问题,请考虑完全升级你的应用程序。如果你确信你的应用程序已经完全更新了,但仍有路径不见的错误,请检查网络问题,确保可以下载并加载应用程序资源。

九、CodePush 命令

1、以下是CodePush常用命令列表: - code-push app add MyApp ios react-native:添加名为MyApp的React Native应用程序以支持CodePush,平台为iOS。 - code-push deployment add MyApp Production:在名为MyApp的应用程序中添加名为Production的自定义部署(默认只有Staging和Production)。 - code-push release-react MyApp ios:将应用程序版本发布到CodePush服务中,以便可以向设备上的用户进行推送。 - code-push promote MyApp-OldProduction ios -r Production:将名为MyApp-OldProduction的部署“升级”为名为Production的生产部署。尽管它是历史上生产的一个版本,但您无需重新提交应用发行版即可获得它。需要注意的是,只有活动(尤其是正在使用生产编译和签名的应用程序)的Production部署才会受此操作的影响。 - code-push rollback MyApp ios Production:回滚到上一个部署的版本。 - code-push access-key ls:列出所有可用的部署密钥。 - code-push access-key add [KeyName]:添加名为[KeyName]的部署密钥。 2、CodePush还有许多其他标志,详情请参阅CodePush官方文档。