iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >React原生APP更新的示例分析
  • 947
分享到

React原生APP更新的示例分析

2023-06-15 08:06:55 947人浏览 八月长安
摘要

这篇文章主要介绍了React原生APP更新的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。App更新流程在 App 打开时请求接口或文件, 获取远程版本/版本更新说明

这篇文章主要介绍了React原生APP更新的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

App更新流程

在 App 打开时请求接口或文件, 获取远程版本/版本更新说明/地址等等重用信息

通过库或者原生方案, 获取 App 的当前版本

比较远程版本和当前版本的区别(可以使用库,也可以自己写一个比较方案)

通过获取到的链接进行操作(可以跳转到对应网站下载,类似蒲公英这种,可以是 apk 链接, 通过安卓原生方法下载, 也可以是 App Store 链接)

大致的流程图

React原生APP更新的示例分析

详细说明:

这些远程信息,可以是接口, 这样可以有一个中台来控制, 当然也可以是一个文件, 让运维来控制
关于信息,不止于远程版本, 在项目里还可以添加其他属性,如: versionCode, versionCodeSwitch , notUpdate , deleteApp

  • 1 versionCode 通过 code 来升级版本,一般是一个数字(在 iOS 里提交 App Store 的时候有需要用到的地方), 这样 versionName 并不会增加, 但是如果添加了 versionCode,  如果要升级 versionName, versionCode 也需要增加

  • 2 versionCodeSwitch 用来控制是否要根据versionCode来更新, 一般我都是在测试和其他环境开启,生产环境关闭的

  • 3 notUpdate 是否要根据远程信息来更新, 一般都是开启状态

  • 4 deleteApp 安卓 app 需要卸载重新安装, 因为直接安装可能存在某些问题, 将会使用此信息,先删除 APP, 再重新下载

获取当前手机的信息,方案较多, 我使用的是 react-native-device-info 这个库, 这个库里面提供的信息较全, 当然也可以使用原生方法, 来获取APP的信息

关于本地版本号和原生版本号之间的对比也是可以使用库,也可以自己写, 这边推荐两个库,下载量都是百万以上的: semver-compare 和 compare-versions, 这边附上我的 versionName 比较方案, 较为简陋:

compareVersion = (currentVersion: string): boolean => {    const {versionName: remoteVersion} = this.remoteInfo || {}    if (!remoteVersion) {        return false    }    if (currentVersion === remoteVersion) {        return false    }    const currentVersionArr = currentVersion.split('.')    const remoteVersionArr = remoteVersion.split('.')    for (let i = 0; i < 3; i++) {        if (Number(currentVersionArr[i]) < Number(remoteVersionArr[i])) {            return true        }    }     return false}

关于下载 app 有很多方案, 最简单的就是跳转链接到第三方平台, 像蒲公英这样的, 使用 RN 提供的 Linking 方法来直接跳转
当然安卓是可以直接通过自己提供的地址下载的, 这里提供一个方法(此方法来源于网络):

@ReactMethodpublic void installApk(String filePath, String fileProviderAuthority) {    File file = new File(filePath);    if (!file.exists()) {        Log.e("RNUpdater", "installApk: file doe snot exist '" + filePath + "'");        // FIXME this should take a promise and fail it return;    }    if (Build.VERSION.SDK_INT >= 24) {        // api24 and up has a package installer that can handle FileProvider content:// URIs Uri contentUri;        try {            contentUri = FileProvider.getUriForFile(getReactApplicationContext(), fileProviderAuthority, file);        } catch (Exception e) {            // FIXME should be a Promise.reject really Log.e("RNUpdater", "installApk exception with authority name '" + fileProviderAuthority + "'", e);            throw e;        }        Intent installApp = new Intent(Intent.ACTION_INSTALL_PACKAGE);        installApp.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);        installApp.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        installApp.setData(contentUri);        installApp.putExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME, reactContext.getApplicationInfo().packageName);        reactContext.startActivity(installApp);    } else {        // Old APIs do not handle content:// URIs, so use an old file:// style String cmd = "chmod 777 " + file;        try {            Runtime.getRuntime().exec(cmd);        } catch (Exception e) {            e.printStackTrace();        }        Intent intent = new Intent(Intent.ACTION_VIEW);        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        intent.setDataAndType(Uri.parse("file://" + file), "application/vnd.Android.package-arcHive");        reactContext.startActivity(intent);    }}

如果是我们自己提供下载服务,需要注意的是带宽, 如果网速过慢则用户体验过差, 还有就会带来更多的流量消耗, 其中的取舍,需要开发者决定

更新APP信息

在打包时, 通过脚本更新接口或者文件信息, 当然这个得看具体的打包方案
比如我现在的方案是使用 jenkins 打包, 在打包时使用 shell 脚本更新对应信息(有需要也可以使用其他语言脚本):

1.首先定义需要获取的文件地址

androidVersionFilePath="$WORKSPACE/android/app/build.gradle"  // 通过此文件获取安卓的版本信息iosVersionFilePath="$WORKSPACE/ios/veronica/Info.plist" // 通过此文件获取iOS的版本信息changeLogPath="$WORKSPACE/change.log" // 将版本更新信息存储在此文件中

2.通过文件地址, 获取打完包后的版本信息

getAndroidVersion(){  androidVersion=$(cat $androidVersionFilePath  | grep "versionName" | awk '{print $2}' | sed 's/\"//g')  androidCode=$(cat $androidVersionFilePath  | grep "versionCode " | awk '{print $2}' | sed 's/\"//g')  androidDelete=$(cat $androidVersionFilePath  | grep "deleteApp" | awk '{print $4}' | sed 's/\"//g')  return 0}getIOSVersion(){  rows=$(awk '/CFBundleShortVersionString/ {getline; print}' $iosVersionFilePath)  iosVersion=$(echo "$rows" | sed -ne 's/<string>\(.*\)<\/string>/\1/p')  iosVersion=$(echo "$iosVersion" | sed 's/^[[:space:]]*//')  rows2=$(awk '/VersionCode/ {getline; print}' $iosVersionFilePath)  iosCode=$(echo "$rows2" | sed -ne 's/<string>\(.*\)<\/string>/\1/p')  iosCode=$(echo "$iosCode" | sed 's/^[[:space:]]*//')  return 0}desc=$(cat $changeLogPath | tr "\n" "#")

3.替换现有文件中的信息

sed -i '' "s/\"releaseInfo\":.*$/\"releaseInfo\": \"$desc\"/"  $JSONPath/$fileNamesed -i '' "s/\"versionName\":.*$/\"versionName\": \"$versionName\",/"  $jsonPath/$fileNamesed -i '' "s/\"versionCode\":.*$/\"versionCode\": \"$versionCode\",/"  $JsonPath/$fileNamesed -i '' "s/\"deleteApp\":.*$/\"deleteApp\": \"$deleteApp\",/"  $JsonPath/$fileName

我的文件是以 json 作为格式的,说明文字是可以任意填写的,会触发一些解析问题:

  • 不允许出现会造成 JSON.parse 解析失败的符号, 如 \ , ````, \n  ,\r, \" 等等

  • 因为说明文字的换行我是通过 # 切割的, 所以也不允许出现这个符号

大致流程图

React原生APP更新的示例分析

感谢你能够认真阅读完这篇文章,希望小编分享的“React原生APP更新的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: React原生APP更新的示例分析

本文链接: https://www.lsjlt.com/news/279097.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • React原生APP更新的示例分析
    这篇文章主要介绍了React原生APP更新的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。App更新流程在 App 打开时请求接口或文件, 获取远程版本/版本更新说明...
    99+
    2023-06-15
  • 浅谈React原生APP更新
    目录App更新流程大致的流程图更新APP信息1.首先定义需要获取的文件地址2.通过文件地址, 获取打完包后的版本信息3.替换现有文件中的信息大致流程图总结App更新流程 1.在 Ap...
    99+
    2024-04-02
  • react native原生模块桥接的示例分析
    这篇文章主要介绍react native原生模块桥接的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Android创建原生模块包通过继承 ReactPackage 为你的原生...
    99+
    2024-04-02
  • Android原生项目集成React Native的示例分析
    小编给大家分享一下Android原生项目集成React Native的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!开发环境准备首先按照开发环境搭建教程来安装React Native在安卓平台上所需的一切依赖软件(...
    99+
    2023-05-30
    android react native
  • kubernetes原生pipeline的示例分析
    kubernetes原生pipeline的示例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Tekton Pipeline,是一个k8s native的pipeline, ...
    99+
    2023-06-05
  • React更新渲染原理深入分析
    目录ScheduleLegacy modeConcurrent mode时间切片任务的优先级获取最先处理的taskReconcile前置知识从jsx到dom双缓存fiber tree...
    99+
    2022-12-23
    React更新渲染 React更新 React渲染
  • react中合成事件与原生事件的示例分析
    小编给大家分享一下react中合成事件与原生事件的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1. 原生事件原生事件就是js的原生事件,如通过docum...
    99+
    2023-06-15
  • React中生命周期的示例分析
    这篇文章将为大家详细讲解有关React中生命周期的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。React的生命周期两张图带你理解 React的生命周期React的生命周期(旧)class&nbs...
    99+
    2023-06-20
  • Postgres-XL更新的示例分析
    本篇文章为大家展示了Postgres-XL更新的示例分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。2018年10月25日2ndQuadrant发布了Postgr...
    99+
    2024-04-02
  • kubernetes中云原生的示例分析
    这篇文章主要为大家展示了“kubernetes中云原生的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“kubernetes中云原生的示例分析”这篇文章吧。一: 云原生云原生包含了一组应用...
    99+
    2023-06-04
  • Nessus更新到8.3.0的示例分析
    这篇文章给大家介绍Nessus更新到8.3.0的示例分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Nessus更新到8.3.0更新内容包括:(1)专业版的报告功能更为灵活,允许用户选择包含的信息。(2)提升Ness...
    99+
    2023-06-05
  • react hooks的示例分析
    这篇文章将为大家详细讲解有关react hooks的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。React在16.8版本正式发布了Hooks。关注了很久,最近正...
    99+
    2024-04-02
  • webpack2+React的示例分析
    这篇文章主要为大家展示了“webpack2+React的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“webpack2+React的示例分析”这篇文章吧...
    99+
    2024-04-02
  • 原生ajax瀑布流的示例分析
    这篇文章主要介绍了原生ajax瀑布流的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。其中img文件夹中放入图片 1.jpg;2.jp...
    99+
    2024-04-02
  • Javascript之React的示例分析
    这篇文章主要介绍Javascript之React的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言React核心的单向数据流、一切皆数据的state、不会改变的props,...
    99+
    2024-04-02
  • Hybrid App技术的示例分析
    这篇文章给大家分享的是有关Hybrid App技术的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。背景随着Web技术的发展和移动互联网的发展,Hybrid技术已经成为一种...
    99+
    2024-04-02
  • 微信小程序App生命周期的示例分析
    小编给大家分享一下微信小程序App生命周期的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!微信小程序App生命周期:on...
    99+
    2024-04-02
  • html5唤起app的示例分析
    这篇文章给大家分享的是有关html5唤起app的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。h6唤起app这种需求是常见的。在移动为王的时代,h6在app导流上发挥着重...
    99+
    2024-04-02
  • React中ref的示例分析
    这篇文章给大家分享的是有关React中ref的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。为了摆脱繁琐的Dom操作, React提倡组件化, 组件内部用数据来驱动视图的...
    99+
    2024-04-02
  • 原生js中ajax访问的示例分析
    这篇文章主要介绍原生js中ajax访问的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!原生js中ajax访问的实例详解form表单中 登录名: 失去光标即触发事件functi...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作