搭建 React Native 热更新平台是许多项目中必须要做的一件事情。本文将会详细讲解搭建该平台的完整攻略。
环境准备
搭建 React Native 热更新平台需要使用到以下几个工具:
- Node.js
- React Native CLI
- JSPatch
- CodePush
首先,确保你的电脑上已经安装了 Node.js,并配置好了 npm 镜像源。然后,使用以下命令安装 React Native CLI 和 JSPatch:
npm install -g react-native-cli jspatch-cli
接着,安装并配置 CodePush。CodePush 是 Microsoft 官方提供的一个热更新解决方案,可以让你方便地将更新推送到移动端。
在安装 CodePush 的过程中,需要注册一个 App Center 账户。登录到 App Center 后,创建一个新的应用程序并为其生成一个 CodePush 密钥。
然后在移动应用程序中安装 CodePush 库:
npm install --save react-native-code-push
在 iOS 项目中安装 CodePush CocoaPod:
npm install --save react-native-code-push
接着,使用以下命令将 CodePush 密钥添加到移动应用程序中:
code-push app add <appName> ios react-native
code-push app add <appName> android react-native
其中,<appName>
是你在 App Center 中创建的应用程序名称。
整合 CodePush 和 JSPatch
CodePush 可以帮助我们升级 JavaScript 代码,而 JSPatch 可以帮助我们升级 Objective-C 和 Swift 代码。因此,我们需要将这两个工具整合起来,实现全平台的热更新。
首先,将 JSPatch 所在的目录添加到 iOS 项目的 Frameworks 目录下,并将其添加到项目的 Linked Frameworks and Libraries 中。然后,在 AppDelegate.m
文件中添加以下代码:
#import "JPEngine.h"
...
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSString *jsPath = [[NSBundle mainBundle] pathForResource:@"main" ofType:@"js"];
[JPEngine startEngine];
[JPEngine evaluateScriptWithPath:jsPath];
...
}
接着,在 iOS 项目的 Build Phases 中添加以下脚本:
curl -O https://d1xiaoqcnqrp0v.cloudfront.net/jspatch-cli.zip
unzip ./jspatch-cli.zip -d ./jspatch-cli
./jspatch-cli/myPatchesCodePush.sh -a <appName> -k <deployKey> -m iOS -o ./CodePush
rm -rf jspatch-cli jspatch-cli.zip
其中,<appName>
是你在 App Center 中创建的应用程序名称,<deployKey>
是该应用程序的部署密钥。
在 Android 项目中,需要添加以下依赖:
compile 'com.tencent.mm:AndHotfix:1.1.0'
然后,在 MainActivity.java
文件中添加以下代码:
import com.tencent.tinker.lib.tinker.TinkerInstaller;
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TinkerInstaller.install(this);
...
}
接着,在 Android 项目的 Build.gradle 中添加以下代码:
dependencies {
...
codepush "com.microsoft.codepush:react-native:1.+"
...
}
最后,在 Android 项目的 build.gradle 中添加以下代码:
def appCenterSdkVersion = '2.0.0'
def codePushSdkVersion = '2.2.5'
...
dependencies {
...
compile "com.microsoft.appcenter:appcenter-crashes:${appCenterSdkVersion}"
compile "com.microsoft.appcenter:appcenter-analytics:${appCenterSdkVersion}"
codepush 'com.microsoft.codepush:android:+' // 添加 CodePush SDK
...
}
// 集成 CodePush SDK
task copySDK(type: Copy) {
from("node_modules/react-native-code-push/android/app/build/outputs/aar/app-release.aar")
into("libs")
}
preBuild.dependsOn(copySDK)
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
}
// 将 patch 包放到 assets 目录下
task copyPatch(dependsOn: ":app:assembleRelease") {
doLast {
File patchVersionFile = new File("CodePush/version");
if (patchVersionFile.exists() == false) {
patchVersionFile.mkdirs();
}
project.copy {
from "CodePush/web"
into "assets/codepush"
}
}
}
assembleRelease.finalizedBy(copyPatch)
然后,在 Android 项目的 MainApplication.java
文件中添加以下代码:
import com.microsoft.codepush.react.CodePush;
...
@Override
protected ReactNativeHost createReactNativeHost() {
return new ReactNativeHost(this) {
...
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
...
new CodePush(BuildConfig.CODEPUSH_KEY, getApplicationContext(), BuildConfig.DEBUG),
...
);
}
...
};
}
其中,BuildConfig.CODEPUSH_KEY
是你在 App Center 中创建的应用程序的部署密钥。
CodePush 和 JSPatch 的整合就完成了。你现在可以通过 CodePush 发布 JavaScript 代码更新,通过 JSPatch 发布 Objective-C 和 Swift 代码更新。
示例说明
下面,我将通过两个示例来展示 React Native 热更新平台的使用方法。
示例 1:发布 JavaScript 代码更新
首先,创建一个名为 MyApp
的 React Native 项目,并将其与 CodePush 进行整合。
然后,在项目中新建一个名为 index.js
的文件,添加以下代码:
import React from 'react';
import { View, Text } from 'react-native';
class MyComponent extends React.Component {
render() {
return (
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
<Text>MyComponent</Text>
</View>
);
}
}
export default MyComponent;
接着,在移动应用程序的 componentDidMount()
函数中,添加以下代码:
import CodePush from 'react-native-code-push';
...
class MyApp extends React.Component {
async componentDidMount() {
await CodePush.sync();
}
...
}
然后使用以下命令将应用程序发布到 CodePush 服务上:
code-push release-react MyApp ios --bundle-id com.example.MyApp --description "Add MyComponent"
其中,--bundle-id
参数是你的应用程序的 Bundle ID,在 Android 中是应用程序的包名。
接着,更新应用程序的 JavaScript 代码,并使用以下命令将该更新发布到 CodePush 服务器上:
code-push release-react MyApp ios --bundle-id com.example.MyApp --description "Update MyComponent"
现在,可以通过 CodePush 来检查更新并将代码升级为最新版本。
import CodePush from 'react-native-code-push';
import MyComponent from './index.js'
...
class MyApp extends React.Component {
async componentDidMount() {
await CodePush.sync();
}
render() {
return (
<View style={{flex: 1}}>
<MyComponent />
</View>
);
}
}
示例 2:发布 Native 代码更新
首先,在 iOS 项目中的 AppDelegate.m
文件中,添加以下代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
...
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor whiteColor];
self.window.rootViewController = [[ViewController alloc] init];
[self.window makeKeyAndVisible];
return YES;
}
接着,在 JSPatch 中添加以下代码:
require('ViewController');
var view = new ViewController().view;
view.backgroundColor = require('UIColor').greenColor();
view.subviews[0].text = 'Hello World!';
使用以下命令来将该代码发布到 CodePush 服务器上:
code-push release MyNativeApp ios ./main.js --deploymentName Production --targetBinaryVersion "1.0.0" --description "Update UI"
然后,在安装了这个应用程序的设备上,使用以下命令来更新 UI:
code-push release-js MyNativeApp ./patch.js --deploymentName Production --targetBinaryVersion "1.0.0" --description "Update UI"
其中,./patch.js
中,包含了可以更新 Native 代码的 JavaScript 脚本,它使用 JSPatch 来更新 UI。
以上两个示例说明了如何在 React Native 项目中使用 CodePush 和 JSPatch 来实现 JavaScript 和 Native 代码的热更新。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:搭建React Native热更新平台的详细过程 - Python技术站