React Native熱更新(iOS)-Pushy

来源:http://www.cnblogs.com/fishbay/archive/2017/07/18/7198782.html
-Advertisement-
Play Games

`React Native iOS RN`是使用腳本語言編寫的,實現了“解釋執行”的方式,而這種執行方式的修改只需替換腳步即可,不需要重新發佈程式,熱更新的方式極大的方便了迭代開發。 今天我們選擇的熱更新組件是 ,這是國內開發的,功能類似 (`CodePush Pushy`支持增量更新,最大化的降低 ...


React Native的出現,使的開發iOS代碼出現了更便捷的方式。由於RN是使用腳本語言編寫的,實現了“解釋執行”的方式,而這種執行方式的修改只需替換腳步即可,不需要重新發佈程式,熱更新的方式極大的方便了迭代開發。

今天我們選擇的熱更新組件是Pushy,這是國內開發的,功能類似CodePushCodePush在國內訪問及其慢,長城寬度根本無法訪問),Pushy支持增量更新,最大化的降低更新的數據量,節約流量。

下麵介紹如何利用Pushy進行熱更新:

1. 創建react native工程

$react-native init PushyDemo

2. 安裝update工具, Pushy熱更新需要update配合使用

  • RN 0.29+

$npm install -g react-native-update-cli

  • RN 0.28及以下

$npm install -g react-native-update-cli rnpm

  • RN 0.29+
$ npm install --save react-native-update
$ react-native link react-native-update
  • RN 0.27-0.28
$ npm install --save [email protected]
$ rnpm link react-native-update
  • RN 0.26及以下
$ npm install --save --save-exact [email protected]
$ rnpm link react-native-update

4. 配置Bundle URL

  • 在工程target的Build Phases --> Link Binary with Libraries中加入libz.tbd、libbz2.1.0.tbd
  • 在你的AppDelegate.m文件中增加如下代碼:
#import "RCTHotUpdate.h"

#if DEBUG
    // 原來的jsCodeLocation
    jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.ios.bundle?platform=ios&dev=true"];
    #else
    jsCodeLocation=[RCTHotUpdate bundleURL];
#endif

5. 配置ATS

  • 從iOS9開始,蘋果要求以白名單的形式在Info.plist中列出外部的非https介面,以督促開發者部署https協議。在我們的服務部署https協議之前,請在Info.plist中添加如下,其中true的類型必須是String:
NSAppTransportSecurity
    NSExceptionDomains  
        reactnative.cn  
    NSIncludesSubdomains

6. 登錄與創建應用

  • 登錄
$ pushy
loginemail: <輸入你的註冊郵箱>
password: <輸入你的密碼>
  • 創建應用
$ pushy createApp --platform ios
App Name: <輸入應用名字>

7. 添加熱更新

  • 導入認證key,檢查更新時必須提供你的appKey,這個值保存在update.json中
import {
    Platform,
} from 'react-native';
import _updateConfig from './update.json';
const {appKey} = _updateConfig[Platform.OS];
  • 檢查更新,下載更新
checkUpdate = () => {
    checkUpdate(appKey).then(info => {
        if (info.expired) {
            Alert.alert('提示', '您的應用版本已更新,請前往應用商店下載新的版本', [
                {text: '確定', onPress: ()=>{info.downloadUrl && Linking.openURL(info.downloadUrl)}},
            ]);
        } else if (info.upToDate) {
            Alert.alert('提示', '您的應用版本已是最新.');
        } else {
            Alert.alert('提示', '檢查到新的版本'+info.name+',是否下載?\n'+ info.description, [
                {text: '是', onPress: ()=>{this.doUpdate(info)}},
                {text: '否',},
            ]);
        }
    }).catch(err => {
        Alert.alert('提示', '更新失敗.' + err);
    });
};

8. 發佈iOS應用

  • 打包ipa文件,並把文件放到PushyDemo的根目錄

  • 上傳ipa,以供後續版本對比只用

    $ pushy uploadIpa PushyDemo.ipa
    Uploading [==================================================================] 100% 0.0s
    Ipa uploaded: 2362
    GandalfdeiMac:PushyDemo gandalf$ pushy bundle --platform ios
    Bundling with React Native version: 0.34.0
    [2016-09-27 14:21:58] Building Dependency Graph
    編譯信息......(略)
    [2016-09-27 14:22:25] Building Dependency Graph (26748ms)
    transformed 368/368 (100%)
    [2016-09-27 14:22:32] Finding dependencies (28763ms)
    bundle: start
    bundle: finish
    bundle: Writing bundle output to: /Users/gandalf/Documents/kelvin/Github/HotUpdate/PushyDemo/build/intermedia/ios/index.bundlejs
    bundle: Copying 5 asset files
    bundle: Done writing bundle output
    bundle: Done copying assets
    Packing
    Bundled saved to: build/output/ios.1474957297204.ppk
    Would you like to publish it?(Y/N) Y
    Uploading [==================================================================] 100% 0.0s
    Enter version name: 1.1.0
    Enter description: change upgrade description
    Enter meta info: {"ok": 1}
    Version published: 5244
    Would you like to bind packages to this version?(Y/N) Y
    2362) 1.0(normal) (newest)
    Total 1 packages.
    Enter packageId: 2362
    OK.
  • 隨後你可以選擇往AppStore發佈這個版本,也可以先通過Test flight等方法進行測試,或者你可以把ipa包通過iTunes安裝到手機進行後續測試。

9. 發佈熱更新版本

  • 修改代碼後,打包新的版本
    $ pushy bundle --platform ios
    Bundling with React Native version: 0.34.0
    [2016-09-27 14:33:39] Building Dependency Graph
    編譯信息......(略)
    [2016-09-27 14:33:51] Building Dependency Graph (12461ms)
    transformed 369/369 (100%)
    [2016-09-27 14:33:54] Finding dependencies (10696ms)
    bundle: start
    bundle: finish
    bundle: Writing bundle output to: /Users/gandalf/Documents/kelvin/Github/HotUpdate/PushyDemo/build/intermedia/ios/index.bundlejs
    bundle: Done writing bundle output
    bundle: Copying 6 asset files
    bundle: Done copying assets
    Packing
    Bundled saved to: build/output/ios.1474958010480.ppk
    Would you like to publish it?(Y/N) Y
    Uploading [==================================================================] 100% 0.0s
    Enter version name: 1.2.0
    Enter description: add image
    Enter meta info: {"ok": 1}
    Version published: 5247
    Would you like to bind packages to this version?(Y/N) Y
    2362) 1.0(normal) - 5244 Fv97KfnZ 1.1.0
    Total 1 packages.
    Enter packageId: 2362
    Ok.

10. 點擊客戶端的刷新按鈕,即可看到有更新版本的提示

到此,已經完成了植入代碼熱更新的全部工作。


參考資料如下

https://github.com/reactnativecn/react-native-pushy/


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Oracle的sql語句的兩種判斷形式 一類情況詳解:實現的是當num這一列的值為3時,就顯示好 以此類推 1)case num when 3 then '好' when 1 then '不好' else '還行' end taskresult 紅色字是給所判斷的這個列名的別名 可以不寫 如果num ...
  • 故障說明: 遠程調整實例記憶體時疏忽,將實例最大記憶體調整為了0,因此最大記憶體變成了128MB的最小值。 解決方式: 1.正常關閉SQL Server服務,如果是集群,需要先關停止集群角色防止故障轉移,然後再單獨關閉服務。 --註意這一步可能會使實例處於掛起狀態很長時間,但是正常關閉是必須的,直接殺進程 ...
  • 早上打開筆記本想開啟SQL Server服務時報錯,於是根據提示查看windows日誌: 依次點開報錯發現第一條是1433埠被占用,於是找相關的進程: 於是殺掉此進程: 然後啟動SQL Server服務成功。 ...
  • 1、string(key:value類型) 2、hash(name {key1:value1,key2:value2,....}) 3、List(隊列,兩邊均可以取值) 4、set(集合,不重覆數據的集) 5、Sorted set(有序集合,帶權重) ...
  • 這裡整理5個Spark的應用實例,希望對Spark學習者能夠有所幫助 ...
  • 1.KILL掉系統里的MySQL進程; killall -TERM mysqld 2.用以下命令啟動MySQL,以不檢查許可權的方式啟動; mysqld --skip-grant-tables & 3.然後用空密碼方式使用root用戶登錄 MySQL; MySQL -u root 4.修改root用戶 ...
  • 開啟回收站RECYCLEBIN=ON,預設開啟ALTER SYSTEM SET RECYCLEBIN=OFF SCOPE=SPFILE;一、從回收站還原表還原刪除的表和從屬對象。如果多個回收站條目具有相同原始名稱,則:使用系統生成的唯一名稱來還原特定版本使用原始名稱時,還原的表遵循後進先出(LIFO... ...
  • 在資料庫開發過程中,字元串和關係表的轉化是一項基本技能。當字元串中存在分隔符時,有時將其轉換成關係表數據,和其他數據表進行join查詢,出現這種情況,是因為沒有遵守關係資料庫的設計範式,沒有把字元串拆分成原子項存儲,也有可能是數據傳參數;有時會遇到相反的情況,需要將關係表的相關數據拼接成一個字元串顯 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...