0. 安裝 react-native-code-push 插件
# cd 到工程根目錄
# 在項(xiàng)目中安裝 react-native-code-push 插件
$ npm install --save react-native-code-push@latest
1. iOS 端:
CodePush 提供 RNPM阵漏、CocoaPods 與 手動(dòng) 三種在 iOS 項(xiàng)目中集成 CodePush 的方式顷扩。以下按照 鏈接 孵运、配置 兩個(gè)步驟進(jìn)行整理:
鏈接篇:
- RNPM - React Native包管理器(RNPM)是一個(gè)非常棒的工具怎爵,它為React Native插件提供了最簡(jiǎn)單的安裝體驗(yàn)锹杈。(該方式集合了鏈接闯割、配置兩個(gè)步驟 - 推薦)
# cd 到工程根目錄
#
# 通過命令自動(dòng)在 iOS 中鏈接曙咽、配置好設(shè)置
$ rnpm link react-native-code-push
# 在終端運(yùn)行此命令之后拉讯,終端會(huì)提示讓你輸入 `deployment key`涤浇,如果不輸入則直接單擊`enter`跳過
rnpm link react-native-code-push
從 React Native v0.27 版本開始,
rnpm link
已經(jīng)被合并到 React Native CLI 中魔慷。只需運(yùn)行:react-native link react-native-code-push
即可只锭。如果您的應(yīng)用程序使用的版本低于 v0.27 的 React Native,請(qǐng)運(yùn)行以下命令:
rnpm link react-native-code-push
如果您尚未安裝 RNPM院尔,可以通過運(yùn)行
npm i -g rnpm
安裝 RNPM 蜻展,然后執(zhí)行上述命令來完成。
deployment key
的值可以通過 CodePush CLI 注冊(cè)邀摆、查詢得到纵顾。
如需更改項(xiàng)目中的deployment key
可在 "iOS 工程文件"->"info.plist"->"CodePushDeploymentKey" 下圖位置更改:
info.plist
-
CocoaPods (該方式目前只是在 iOS 中進(jìn)行了插件鏈接,需繼續(xù)配置)
將 CodePush 插件依賴項(xiàng)添加到您的Podfile
栋盹,指向工程文件中的安裝路徑
# Podfile文件
pod 'CodePush', :path => '../node_modules/react-native-code-push'
執(zhí)行 pod
安裝
# cd 到 iOS 工程目錄 執(zhí)行
$ pod install
注:需繼續(xù)進(jìn)行配置施逾,見配置篇步驟。
- 手動(dòng)集成(該方式目前只是在 iOS 中進(jìn)行了插件鏈接例获,需繼續(xù)配置)
1.在 Xcode 中打開應(yīng)用項(xiàng)目
-
2.將工程文件目錄下 "node_modules/react-native-code-push/ios" 中的 "CodePush.xcodeproj" 文件拖動(dòng)到 Xcode 工程節(jié)點(diǎn) Libraries 里汉额,如下圖:
將CodePush添加到項(xiàng)目 3.在 Xcode 中選擇項(xiàng)目節(jié)點(diǎn),并選擇項(xiàng)目配置的 "Build Phases" 選項(xiàng)卡榨汤。
-
4.從 "Libraries/CodePush.xcodeproj/Products" 拖動(dòng) "libCodePush.a" 到項(xiàng)目"Build Phases" 的 "Link Binary With Libraries" 闷愤。
在構(gòu)建期間鏈接CodePush -
5.單擊 "Link Binary With Libraries" 列表下方的加號(hào),添加 "libz.tbd"件余。
Libz參考
注:需繼續(xù)進(jìn)行配置,見配置篇步驟遭居。
配置篇:
注:如果您使用了 RNPM 的集成方式啼器,那么您可以跳過此部分。
當(dāng)你的 iOS 項(xiàng)目鏈接到 CodePush 插件俱萍,你需要配置你的應(yīng)用程序來咨詢 CodePush 的 JS包 的位置端壳,因?yàn)樗?fù)責(zé)將其與發(fā)布到 CodePush 服務(wù)器的更新同步。
步驟:
- 打開
AppDelegate.m
文件枪蘑,并引入CodePush
頭文件:
#import <CodePush/CodePush.h>
- 找到以下代碼行:
jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
- 將其替換為此行:
jsCodeLocation = [CodePush bundleURL];
此更改將應(yīng)用配置為始終加載應(yīng)用的
jsbundle
的最新版本 损谦。在通過 CodePush 推送更新前岖免,他只會(huì)使用應(yīng)用程序編譯的文件。但是照捡,在通過 CodePush 推送更新后颅湘,它將返回最近安裝更新的位置。
注意:
該bundleURL
方法假定應(yīng)用程序的jsbundle
為默認(rèn)的main.jsbundle
栗精。如果你更改了應(yīng)用程序jsbundle
的文件名闯参,則只需調(diào)用方法bundleURLForResource:
或bundleURLForResource:withExtension:
以覆蓋默認(rèn)的行為。
建議使用 DEBUG 宏預(yù)處理器
悲立,實(shí)現(xiàn)在開發(fā)模式下調(diào)試 和 在生產(chǎn)模式下使用 CodePush 熱更新之間動(dòng)態(tài)切換鹿寨。具體代碼如下:
NSURL *jsCodeLocation;
#ifdef DEBUG
jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil];
#else
jsCodeLocation = [CodePush bundleURL];
#endif
在應(yīng)用程序中添加 CodePushDeploymentKey
為了要讓程序在執(zhí)行
[CodePush bundleURL]
時(shí)知道它應(yīng)該查詢哪個(gè)部署更新,需要在應(yīng)用程序 "Info.plist" 文件中薪夕,添加一個(gè)新的條目CodePushDeploymentKey
脚草,其值是你在 CodePush CLI 中注冊(cè)此應(yīng)用程序的Deployment Key
值。
你可以通過運(yùn)行
code-push deployment ls <appName> -k
在 CodePush CLI 中檢索此值原献。
2. ReactNative 端:
設(shè)置更新控制策略:
在使用 CodePush 更新你的應(yīng)用之前馏慨,需要先設(shè)置一下更新控制策略,即:
- 什么時(shí)候檢查更新嚼贡?(在APP啟動(dòng)的時(shí)候熏纯?在設(shè)置頁面添加一個(gè)檢查更新按鈕?設(shè)置一個(gè)固定的間隔周期性的檢查粤策?)
- 什么時(shí)候可以更新樟澜,如何將更新呈現(xiàn)給客戶端用戶?
最簡(jiǎn)單的方式是在根組件中進(jìn)行策略控制:
import codePush from "react-native-code-push";
class MyApp extends Component {
}
MyApp = codePush(MyApp);
或者
import codePush from 'react-native-code-push'
class MyApp extends Component {
componentDidMount() {
codePush.sync();
}
}
默認(rèn)情況下叮盘,在應(yīng)用程序啟動(dòng)的時(shí)候 CodePush 將檢查更新秩贰。
- 如果有可用的更新,它將被靜默下載柔吼,并在下次應(yīng)用程序重新啟動(dòng)時(shí)安裝更新毒费,確保用戶看到的是最新版本。
- 如果可用更新是強(qiáng)制性的愈魏,更新文件下載好之后會(huì)立即進(jìn)行更新觅玻。
如果你希望應(yīng)用程序更快地發(fā)現(xiàn)更新,可以在每次應(yīng)用程序從后臺(tái)恢復(fù)時(shí)與 CodePush 服務(wù)器同步培漏,檢查更新:
let codePushOptions = { checkFrequency: codePush.CheckFrequency.ON_APP_RESUME };
class MyApp extends Component {
}
MyApp = codePush(codePushOptions)(MyApp);
發(fā)布更新
可參考 React Native 熱更新 -- CodePush CLI 安裝及基本使用 中 4.發(fā)布更新 的提示進(jìn)行操作溪厘。