最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談React原生APP更新

 更新時間:2021年06月03日 14:31:20   作者:Grewer  
當(dāng)一個APP在運(yùn)行的時候, 開發(fā)者想要將自己的代碼更新到用戶的手機(jī)上時, 一般都有兩種方案, 一是熱更新, 二就是APP更新.熱更新暫且不說,這篇文章就講講 APP 如何更新。

App更新流程

1.在 App 打開時請求接口或文件, 獲取遠(yuǎn)程版本/版本更新說明/地址等等重用信息

2.通過庫或者原生方案, 獲取 App 的當(dāng)前版本

3.比較遠(yuǎn)程版本和當(dāng)前版本的區(qū)別(可以使用庫,也可以自己寫一個比較方案)

4.通過獲取到的鏈接進(jìn)行操作(可以跳轉(zhuǎn)到對應(yīng)網(wǎng)站下載,類似蒲公英這種,可以是 apk 鏈接, 通過安卓原生方法下載, 也可以是 App Store 鏈接)

大致的流程圖

詳細(xì)說明:

1.這些遠(yuǎn)程信息,可以是接口, 這樣可以有一個中臺來控制, 當(dāng)然也可以是一個文件, 讓運(yùn)維來控制
關(guān)于信息,不止于遠(yuǎn)程版本, 在項(xiàng)目里還可以添加其他屬性,如: versionCode, versionCodeSwitch , notUpdate , deleteApp

  • 1.1 versionCode 通過 code 來升級版本,一般是一個數(shù)字(在 ios 里提交 App Store 的時候有需要用到的地方), 這樣 versionName 并不會增加, 但是如果添加了 versionCode, 如果要升級 versionName, versionCode 也需要增加
  • 1.2 versionCodeSwitch 用來控制是否要根據(jù)versionCode來更新, 一般我都是在測試和其他環(huán)境開啟,生產(chǎn)環(huán)境關(guān)閉的
  • 1.3 notUpdate 是否要根據(jù)遠(yuǎn)程信息來更新, 一般都是開啟狀態(tài)
  • 1.4 deleteApp 安卓 app 需要卸載重新安裝, 因?yàn)橹苯影惭b可能存在某些問題, 將會使用此信息,先刪除 APP, 再重新下載

2.獲取當(dāng)前手機(jī)的信息,方案較多, 我使用的是 react-native-device-info 這個庫, 這個庫里面提供的信息較全, 當(dāng)然也可以使用原生方法, 來獲取APP的信息

3.關(guān)于本地版本號和原生版本號之間的對比也是可以使用庫,也可以自己寫, 這邊推薦兩個庫,下載量都是百萬以上的: semver-compare 和 compare-versions, 這邊附上我的 versionName 比較方案, 較為簡陋:

/**
 * 比較兩版本號 
 * @param currentVersion 
 * @return boolean 
 * true=需要更新 false=不需要 
 */
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
}

關(guān)于下載 app 有很多方案, 最簡單的就是跳轉(zhuǎn)鏈接到第三方平臺, 像蒲公英這樣的, 使用 RN 提供的 Linking 方法來直接跳轉(zhuǎn)
當(dāng)然安卓是可以直接通過自己提供的地址下載的, 這里提供一個方法(此方法來源于網(wǎng)絡(luò)):

@ReactMethod
public 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);
    }
}

如果是我們自己提供下載服務(wù),需要注意的是帶寬, 如果網(wǎng)速過慢則用戶體驗(yàn)過差, 還有就會帶來更多的流量消耗, 其中的取舍,需要開發(fā)者決定

更新APP信息

在打包時, 通過腳本更新接口或者文件信息, 當(dāng)然這個得看具體的打包方案
比如我現(xiàn)在的方案是使用 Jenkins 打包, 在打包時使用 shell 腳本更新對應(yīng)信息(有需要也可以使用其他語言腳本):

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/\"http://g')
  androidCode=$(cat $androidVersionFilePath  | grep "versionCode " | awk '{print $2}' | sed 's/\"http://g')
  androidDelete=$(cat $androidVersionFilePath  | grep "deleteApp" | awk '{print $4}' | sed 's/\"http://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.替換現(xiàn)有文件中的信息

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

我的文件是以 json 作為格式的,說明文字是可以任意填寫的,會觸發(fā)一些解析問題:

  • 不允許出現(xiàn)會造成 JSON.parse 解析失敗的符號, 如 \ , ````, \n ,\r, \" 等等
  • 因?yàn)檎f明文字的換行我是通過 # 切割的, 所以也不允許出現(xiàn)這個符號

大致流程圖

總結(jié)

關(guān)于 APP 原生版本的更新流程基本就是這樣,當(dāng)然這個流程不光適用 APP, 也可以用于 PC 軟件的更新
除了原生版本的更新,還有熱更新, 也是非常重要的,

以上就是淺談React原生APP更新的詳細(xì)內(nèi)容,更多關(guān)于React原生APP更新的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • react項(xiàng)目從新建到部署的實(shí)現(xiàn)示例

    react項(xiàng)目從新建到部署的實(shí)現(xiàn)示例

    這篇文章主要介紹了react項(xiàng)目從新建到部署的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • React服務(wù)端渲染(總結(jié))

    React服務(wù)端渲染(總結(jié))

    當(dāng)我們要求渲染時間盡量快、頁面響應(yīng)速度快時就會用到服務(wù)端渲染,本篇文章主要介紹了React服務(wù)端渲染,有興趣的可以了解一下
    2017-07-07
  • ReactNative點(diǎn)擊事件.bind(this)操作分析

    ReactNative點(diǎn)擊事件.bind(this)操作分析

    這篇文章主要為大家介紹了ReactNative點(diǎn)擊事件.bind(this)操作分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • React組件重復(fù)渲染的成因與解決方法

    React組件重復(fù)渲染的成因與解決方法

    React 組件的重復(fù)渲染是開發(fā)中常見的性能問題之一,尤其是在大型應(yīng)用中,組件的頻繁渲染會導(dǎo)致性能瓶頸,本文將探討 React 組件重復(fù)渲染的常見原因,并提供優(yōu)化策略,幫助開發(fā)者提升應(yīng)用性能,需要的朋友可以參考下
    2025-03-03
  • React?Router掌握路由搭建與權(quán)限管控的操作方法(?從入門到精通)

    React?Router掌握路由搭建與權(quán)限管控的操作方法(?從入門到精通)

    本文詳細(xì)介紹了React?Router庫在React應(yīng)用開發(fā)中的應(yīng)用,包括其核心功能、安裝使用、基礎(chǔ)使用、核心組件和功能、路由參數(shù)和嵌套路由、編程式導(dǎo)航以及路由權(quán)限管理等方面,感興趣的朋友一起看看吧
    2025-01-01
  • 詳解React??App.js?文件的結(jié)構(gòu)和作用

    詳解React??App.js?文件的結(jié)構(gòu)和作用

    在React應(yīng)用中,App.js文件通常是項(xiàng)目的根組件文件,它負(fù)責(zé)組織和渲染其他組件,是應(yīng)用的核心部分,本文將詳細(xì)介紹App.js文件的結(jié)構(gòu)、作用和最佳實(shí)踐,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • React四級菜單的實(shí)現(xiàn)

    React四級菜單的實(shí)現(xiàn)

    本文主要介紹了React四級菜單的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • 詳解操作虛擬dom模擬react視圖渲染

    詳解操作虛擬dom模擬react視圖渲染

    這篇文章主要介紹了詳解操作虛擬dom模擬react視圖渲染,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • react配置px轉(zhuǎn)換rem的方法

    react配置px轉(zhuǎn)換rem的方法

    這篇文章主要介紹了react配置px轉(zhuǎn)換rem的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • React useState超詳細(xì)講解用法

    React useState超詳細(xì)講解用法

    我正在處理的組件是表單的時間輸入。表單相對復(fù)雜,并且是動態(tài)生成的,根據(jù)嵌套在其他數(shù)據(jù)中的數(shù)據(jù)顯示不同的字段。我正在用useReducer管理表單的狀態(tài),到目前為止效果很好
    2022-11-11

最新評論

玉环县| 大荔县| 海晏县| 婺源县| 扎兰屯市| 兴业县| 凤凰县| 大荔县| 永昌县| 黑河市| 东辽县| 沙田区| 广水市| 格尔木市| 林口县| 晋城| 永济市| 信阳市| 武山县| 金门县| 攀枝花市| 察隅县| 通道| 阳曲县| 石楼县| 高陵县| 天水市| 永川市| 固原市| 西峡县| 尼玛县| 时尚| 卓尼县| 周宁县| 中阳县| 察隅县| 江北区| 甘泉县| 新密市| 滦平县| 汉源县|