React Native 客户端 SDK 入门
重要
Visual Studio App Center 计划于 2025 年 3 月 31 日停用。 虽然可以继续使用 Visual Studio App Center,直到它完全停用,但你可以考虑迁移到几个建议的替代方法。
按照常规用途的“入门”说明设置 CodePush 帐户后,可以通过从应用的根目录中运行以下命令,开始在React Native应用中集成 CodePush:
npm install --save react-native-code-push
与所有其他React Native插件一样,iOS 和 Android 的集成体验也不同,因此请根据应用的目标平台 () 执行设置步骤。 请注意,如果同时面向这两个平台,建议为每个平台创建单独的 CodePush 应用程序。
如果想要了解其他项目如何与 CodePush 集成,请参阅社区提供 的示例应用。 此外,如果想要熟悉 CodePush + React Native,请参阅 Bilal Budhani 和 Deepak Sisodiya 制作的入门视频。
重要
本指南假定你已使用 react-native init
命令初始化React Native项目。 从 2017 年 3 月起, 命令create-react-native-app
还可用于初始化React Native项目。 如果使用此命令,请在项目的主目录中运行 npm run eject
,以获取与所创建项目类似的 react-native init
项目。
iOS 设置
拥有 CodePush 插件后,必须将其集成到 React Native 应用的 Xcode 项目中并正确配置。
React Native 0.60 及更高版本的插件安装和配置 (iOS)
运行
cd ios && pod install && cd ..
以安装所有必要的 CocoaPods 依赖项。打开
AppDelegate.m
文件,并为 CodePush 标头添加 import 语句:#import <CodePush/CodePush.h>
查找以下代码行,用于设置生产版本的网桥的源 URL:
return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
将其替换为以下行:
return [CodePush bundleURL];
此更改将应用配置为始终加载应用的 JS 捆绑包的最新版本。 在第一次启动时,这对应于使用应用编译的文件。 但是,通过 CodePush 推送更新后,这将返回最近安装的更新的位置。
注意
方法
bundleURL
假定应用的 JS 捆绑包名为main.jsbundle
。 如果已将应用配置为使用其他文件名,请调用bundleURLForResource:
方法 (假定你改用.jsbundle
扩展名) 或bundleURLForResource:withExtension:
方法,以覆盖该默认行为。通常,你只想使用 CodePush 解析发布版本中的 JS 捆绑包位置。 建议使用
DEBUG
预处理器宏在使用包装器服务器和 CodePush 之间动态切换,具体取决于是否在调试。 这使得在调试时仍使用 Chrome 开发工具、实时重载等的同时,在生产环境中获得所需的正确行为要简单得多。sourceURLForBridge
方法应如下所示:- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge { #if DEBUG return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil]; #else return [CodePush bundleURL]; #endif }
将部署密钥添加到
Info.plist
:若要让 CodePush 运行时知道它应针对哪个部署查询更新,请打开应用的Info.plist
文件并添加一个名为CodePushDeploymentKey
的新条目,其值为要针对 (配置此应用的部署的键,如应用) 部署FooBar
的密钥Staging
。 可以通过以下方式检索此值:转到 AppCenter 仪表板上的应用分发 UI 或使用 CodePush CLI 运行appcenter codepush deployment list --app <ownerName>/<appName> -k
, (-k
标志是必需的,因为默认情况下不会显示密钥) 并复制与要使用的部署对应的列的值Deployment Key
, (请参阅下面的) 。 使用部署的名称 ((如暂存) )不起作用。 该“友好名称”仅用于 CLI 中经过身份验证的管理使用,而不适用于应用中的公共使用。若要有效地利用
Staging
与 CodePush 应用一起创建的 和Production
部署,请在将应用的 CodePush 使用情况实际移动到生产环境之前,请参阅下面的 多部署测试 文档。注意
如果需要动态使用不同的部署,还可以使用代码推送选项替代 JS 代码中的部署密钥*
(iOS) 低于 0.60 的 React Native 插件安装
为了尽可能多地适应开发人员首选项,CodePush 插件通过三种机制支持 iOS 安装:
RNPM - React Native包管理器 (RNPM) 是一款出色的工具,可为React Native插件提供最简单的安装体验。 如果你已在使用它,或者你想要使用它,我们建议使用此方法。
CocoaPods - 如果要构建嵌入React Native的本机 iOS 应用,或者更喜欢使用 CocoaPods,我们建议使用作为插件的一部分随附的 Podspec 文件。
“手动” - 如果不想依赖任何其他工具,或者无需执行一些额外的安装步骤, (这是一次性) ,请使用此方法。
iOS (插件安装 - RNPM)
从 React Native v0.27 起,
rnpm link
已合并到 React Native CLI 中。 运行:react-native link react-native-code-push
如果应用使用低于 v0.27 的 React Native 版本,请执行以下命令:
rnpm link react-native-code-push
注意
如果尚未安装 RNPM,可以通过运行
npm i -g rnpm
并执行上述命令来执行此操作。 如果已安装 RNPM,请确保具有 v1.9.0+,以便从此一步安装中受益。系统将提示你输入要使用的部署密钥。 如果还没有此值,可以通过运行
appcenter codepush deployment list -a <ownerName>/<appName> --displayKeys
来检索此值,也可以选择 (忽略它,方法是点击<ENTER>
) ,稍后再将其添加到中。 若要开始,建议使用Staging
部署密钥,以便可以端到端测试 CodePush。
iOS (插件安装 - CocoaPods)
将 React Native 和 CodePush 插件依赖项添加到
Podfile
,指向 NPM 安装模块的路径# React Native requirements pod 'React', :path => '../node_modules/react-native', :subspecs => [ 'Core', 'CxxBridge', # Include this for RN >= 0.47 'DevSupport', # Include this to enable In-App Devmenu if RN >= 0.43 'RCTText', 'RCTNetwork', 'RCTWebSocket', # Needed for debugging 'RCTAnimation', # Needed for FlatList and animations running on native UI thread # Add any other subspecs you want to use in your project ] # Explicitly include Yoga if you're using RN >= 0.42.0 pod 'yoga', :path => '../node_modules/react-native/ReactCommon/yoga' pod 'DoubleConversion', :podspec => '../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec' pod 'glog', :podspec => '../node_modules/react-native/third-party-podspecs/glog.podspec' pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec' # CodePush plugin dependency pod 'CodePush', :path => '../node_modules/react-native-code-push'
注意
依赖项的文件路径必须相对于应用
Podfile
的位置。注意
项目的
JWT
库必须是 3.0.x 或更高版本运行
pod install
注意
CodePush .podspec
依赖于 React
Pod,因此为了确保它可以正确使用生成应用的 React Native 版本,请确保按照React Native集成文档中的说明在应用中Podfile
定义React
依赖项。
iOS (插件安装 - 手动)
打开应用的 Xcode 项目
CodePush.xcodeproj
node_modules/react-native-code-push/ios
在目录中找到文件 (或node_modules/react-native-code-push
=1.7.3-beta
<安装) ,并将其拖动到Libraries
Xcode 中的节点在 Xcode 中选择项目节点,然后选择项目配置的“生成阶段”选项卡。
从
Libraries/CodePush.xcodeproj/Products
拖libCodePush.a
到项目的“生成阶段”配置的“链接二进制文件”部分。单击“将二进制文件与库链接”列表下面的加号,然后选择
libz.tbd
节点下的iOS 9.1
库。注意
或者,如果愿意,可以将 标志添加到
-lz
Other Linker Flags
部分的Build Settings
字段中Linking
。
iOS) 低于 0.60 (React Native 插件配置
注意
如果使用 RNPM 或 react-native link
自动链接插件,则这些步骤已为你完成,因此可以跳过此部分。
将 Xcode 项目设置为生成/链接 CodePush 插件后,需要将应用配置为针对 JS 捆绑包的位置检查 CodePush,因为它负责将其与发布到 CodePush 服务器的更新同步。 为此,请按照下列步骤进行操作:
打开 AppDelegate.m 文件,并为 CodePush 标头添加 import 语句:
#import <CodePush/CodePush.h>
对于 React Native 0.59 - 0.59.10:
查找以下代码行,用于设置生产版本的网桥的源 URL:
return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
将其替换为以下行:
return [CodePush bundleURL];
对于 React Native 0.58 及更低版本:
查找以下代码行,用于从应用二进制文件加载 JS 捆绑包以用于生产版本:
jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
将其替换为以下行:
jsCodeLocation = [CodePush bundleURL];
此更改将应用配置为始终加载应用的 JS 捆绑包的最新版本。 在第一次启动时,这对应于使用应用编译的文件。 但是,通过 CodePush 推送更新后,这将返回最近安装的更新的位置。
注意
方法 bundleURL
假定应用的 JS 捆绑包名为 main.jsbundle
。 如果已将应用配置为使用其他文件名,请调用 bundleURLForResource:
方法 (假定你改用 .jsbundle
扩展名) 或 bundleURLForResource:withExtension:
方法,以覆盖该默认行为。
通常,你只想使用 CodePush 解析发布版本中的 JS 捆绑包位置。 建议使用 DEBUG
预处理器宏在使用包装器服务器和 CodePush 之间动态切换,具体取决于是否在调试。 这使得在调试时仍使用 Chrome 开发工具、实时重载等的同时,在生产环境中获得所需的正确行为要简单得多。
对于 React Native 0.59 - 0.59.10:
- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
{
#if DEBUG
return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
#else
return [CodePush bundleURL];
#endif
}
对于 React Native 0.58 及更低版本:
NSURL *jsCodeLocation;
#ifdef DEBUG
jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
#else
jsCodeLocation = [CodePush bundleURL];
#endif
若要让 CodePush 运行时知道它应针对哪个部署查询更新,请打开项目的 Info.plist 文件并添加一个名为 CodePushDeploymentKey
的新条目,其值为要针对 (配置此应用的部署键,例如应用) 部署FooBar
的密钥Staging
。 可以通过在 CodePush CLI 中运行 appcenter codepush deployment list -a <ownerName>/<appName> --displayKeys
并复制与要使用的部署相对应的列的值 Deployment Key
来检索此值 (请参阅以下) 。 使用部署名称 () Staging
不起作用。 该“友好名称”仅用于 CLI 中经过身份验证的管理使用,而不适用于应用中的公共使用。
若要有效地利用 Staging
与 CodePush 应用一起创建的 和 Production
部署,请参阅下面的 多部署测试 文档,然后再将应用的 CodePush 使用情况实际移动到生产环境。
http 异常域配置 (iOS)
CodePush 插件向以下域发出 HTTPS 请求:
- codepush.appcenter.ms
- codepush.blob.core.windows.net
- codepushupdates.azureedge.net
如果要更改其中任何域的默认 HTTP 安全配置,请在NSAppTransportSecurity
项目的 Info.plist 文件中定义 (ATS) 配置:
<plist version="1.0">
<dict>
<!-- ...other configs... -->
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>codepush.appcenter.ms</key>
<dict><!-- read the ATS Apple Docs for available options --></dict>
</dict>
</dict>
<!-- ...other configs... -->
</dict>
</plist>
在执行任何操作之前,请先参阅 Apple 文档 。
iOS) (代码签名设置
可以在发布期间对捆绑包进行自签名,并在安装更新之前验证其签名。 有关代码签名的详细信息,请参阅 相关代码推送文档部分。
若要配置用于捆绑验证的公钥,需要在 中添加 Info.plist
一条记录,其中包含公钥内容的名称和 CodePushPublicKey
字符串值。 例如:
<plist version="1.0">
<dict>
<!-- ...other configs... -->
<key>CodePushPublicKey</key>
<string>-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANkWYydPuyOumR/sn2agNBVDnzyRpM16NAUpYPGxNgjSEp0etkDNgzzdzyvyl+OsAGBYF3jCxYOXozum+uV5hQECAwEAAQ==
-----END PUBLIC KEY-----</string>
<!-- ...other configs... -->
</dict>
</plist>
Android 设置
若要将 CodePush 集成到 Android 项目中,请执行以下步骤:
Android) (插件安装
React Native 0.60 及更高版本的插件安装和配置 (Android)
android/settings.gradle
在文件中,进行以下添加:include ':app', ':react-native-code-push' project(':react-native-code-push').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-code-push/android/app')
在文件中
android/app/build.gradle
,将codepush.gradle
文件添加为附加的生成任务定义:... apply from: "../../node_modules/react-native-code-push/android/codepush.gradle" ...
MainApplication.java
更新 (,或者MainApplicationReactNativeHost.java
如果使用 React Native 0.68 - 0.70) 文件,则通过以下更改使用 CodePush:... // 1. Import the plugin class. import com.microsoft.codepush.react.CodePush; public class MainApplication extends Application implements ReactApplication { private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { ... // 2. Override the getJSBundleFile method to let // the CodePush runtime determine where to get the JS // bundle location from on each app start @Override protected String getJSBundleFile() { return CodePush.getJSBundleFile(); } }; }
将部署密钥添加到
strings.xml
:若要让 CodePush 运行时知道它应查询更新的部署,请打开应用
strings.xml
的文件并添加一个名为CodePushDeploymentKey
的新字符串,其值是要针对 (配置此应用的部署的密钥,例如应用) 部署FooBar
的密钥Staging
。 可以通过在 App Center CLI 中运行appcenter codepush deployment list -a <ownerName>/<appName> -k
来检索此值,-k
(标志是必需的,因为默认情况下不会显示密钥) 并复制与要使用的部署相对应的列的值Key
, (请参阅下面的) 。 使用部署的名称 ((如暂存) )不起作用。 “友好名称”仅用于 CLI 中经过身份验证的管理使用,而不适用于应用内的公共使用。若要有效地利用
Staging
与 CodePush 应用一起创建的 和Production
部署,请参阅下面的 多部署测试 文档,然后再将应用的 CodePush 使用情况实际移动到生产环境。strings.xml
文件应如下所示:<resources> <string name="app_name">AppName</string> <string moduleConfig="true" name="CodePushDeploymentKey">DeploymentKey</string> </resources>
注意
如果需要动态使用不同的部署,还可以使用代码推送选项在 JS 代码中替代部署密钥*
适用于低于 0.60 React Native 的插件安装 (Android)
为了适应尽可能多的开发人员首选项,CodePush 插件支持通过两种机制进行 Android 安装:
RNPM - React Native包管理器 (RNPM) 是一款出色的工具,可为React Native插件提供最简单的安装体验。 如果你已在使用它,或者想要使用它,我们建议使用此方法。
“手动” - 如果你不想依赖任何其他工具,或者无需执行一些额外的安装步骤, (这是一次性) ,则采用此方法。
注意
由于 React Native 存储库中的代码发生了更改,如果安装的React Native版本范围为 0.29 到 0.32,建议按照手动步骤正确设置。
Android (插件安装 - RNPM)
自 React Native v0.27 起,
rnpm link
已合并到 React Native CLI 中。 运行:react-native link react-native-code-push
如果应用使用低于 v0.27 的 React Native 版本,请运行下一个命令:
rnpm link react-native-code-push
注意
如果尚未安装 RNPM,可以通过运行
npm i -g rnpm
并执行上述命令来执行此操作。如果使用 RNPM >=1.6.0,系统会提示你输入要使用的部署密钥。 如果还没有此值,可以通过运行
appcenter codepush deployment list -a <ownerName>/<appName> --displayKeys
来检索此值,也可以选择通过点击<ENTER>
) (忽略此值,稍后再将其添加到中。 若要开始,建议使用Staging
部署密钥,以便可以端到端测试 CodePush。
这就是使用 RNPM 进行安装! 继续执行以下 插件配置 部分以完成设置。
Android (插件安装 - 手动)
android/settings.gradle
在文件中,进行以下添加:include ':app', ':react-native-code-push' project(':react-native-code-push').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-code-push/android/app')
android/app/build.gradle
在文件中,将:react-native-code-push
项目添加为编译时依赖项:... dependencies { ... compile project(':react-native-code-push') }
在文件中
android/app/build.gradle
,将codepush.gradle
文件添加为附加的生成任务定义:... apply from: "../../node_modules/react-native-code-push/android/codepush.gradle" ...
Android) 低于 0.60 的 (React Native 插件配置
注意
如果使用 RNPM 或 react-native link
自动链接插件,则这些步骤已为你完成,因此你可以跳过本部分。
安装插件并将 Android Studio 项目与 Gradle 同步后,需要将应用配置为为 JS 捆绑包的位置检查 CodePush,因为它将“控制”管理当前和所有未来版本。 为此,请按以下步骤操作:
对于 React Native >= v0.29
如果要将 CodePush 集成到 React Native 应用程序中,请执行以下步骤:
通过以下更改更新 MainApplication.java
文件以使用 CodePush:
...
// 1. Import the plugin class.
import com.microsoft.codepush.react.CodePush;
public class MainApplication extends Application implements ReactApplication {
private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
...
// 2. Override the getJSBundleFile method to let
// the CodePush runtime determine where to get the JS
// bundle location from on each app start
@Override
protected String getJSBundleFile() {
return CodePush.getJSBundleFile();
}
@Override
protected List<ReactPackage> getPackages() {
// 3. Instantiate an instance of the CodePush runtime and add it to the list of
// existing packages, specifying the right deployment key. If you don't already
// have it, you can run "appcenter codepush deployment list -a <ownerName>/<appName> --displayKeys" to retrieve your key.
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new CodePush("deployment-key-here", MainApplication.this, BuildConfig.DEBUG)
);
}
};
}
如果要将React Native集成到现有的本机应用程序中,请执行以下步骤:
更新 MyReactActivity.java
(应用) 文件中可能以不同的方式对其进行命名,以便通过以下更改使用 CodePush:
...
// 1. Import the plugin class.
import com.microsoft.codepush.react.CodePush;
public class MyReactActivity extends Activity {
private ReactRootView mReactRootView;
private ReactInstanceManager mReactInstanceManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
mReactInstanceManager = ReactInstanceManager.builder()
// ...
// Add CodePush package
.addPackage(new CodePush("deployment-key-here", getApplicationContext(), BuildConfig.DEBUG))
// Get the JS Bundle File via CodePush
.setJSBundleFile(CodePush.getJSBundleFile())
// ...
.build();
mReactRootView.startReactApplication(mReactInstanceManager, "MyReactNativeApp", null);
setContentView(mReactRootView);
}
...
}
对于 React Native v0.19 - v0.28
通过以下更改更新 MainActivity.java 文件以使用 CodePush:
...
// 1. Import the plugin class (if you used RNPM to install the plugin, this
// should already be done for you automatically so you can skip this step).
import com.microsoft.codepush.react.CodePush;
public class MainActivity extends ReactActivity {
// 2. Override the getJSBundleFile method to let
// the CodePush runtime determine where to get the JS
// bundle location from on each app start
@Override
protected String getJSBundleFile() {
return CodePush.getJSBundleFile();
}
@Override
protected List<ReactPackage> getPackages() {
// 3. Instantiate an instance of the CodePush runtime and add it to the list of
// existing packages, specifying the right deployment key. If you don't already
// have it, you can run "appcenter codepush deployment list -a <ownerName>/<appName> --displayKeys" to retrieve your key.
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new CodePush("deployment-key-here", this, BuildConfig.DEBUG)
);
}
...
}
后台React实例
注意
仅当在没有 (的情况下显式启动React Native实例Activity
(例如,从本机推送通知接收方) )时才需要本节。 对于这些情况,必须告知 CodePush 如何查找React Native实例。
若要更新/重启React Native实例,在尝试在后台重启实例之前,必须使用 配置 ReactInstanceHolder
CodePush。 这是在 Application
实现中完成的。
对于 React Native >= v0.29
通过以下更改更新 MainApplication.java
文件以使用 CodePush:
...
// 1. Declare your ReactNativeHost to extend ReactInstanceHolder. ReactInstanceHolder is a subset of ReactNativeHost, so no additional implementation is needed.
import com.microsoft.codepush.react.ReactInstanceHolder;
public class MyReactNativeHost extends ReactNativeHost implements ReactInstanceHolder {
// ... usual overrides
}
// 2. Provide your ReactNativeHost to CodePush.
public class MainApplication extends Application implements ReactApplication {
private final MyReactNativeHost mReactNativeHost = new MyReactNativeHost(this);
@Override
public void onCreate() {
CodePush.setReactInstanceHolder(mReactNativeHost);
super.onCreate();
}
}
对于 React Native v0.19 - v0.28
在 v0.29 之前,React Native未提供ReactNativeHost
抽象。 如果要启动后台实例,则可能已生成自己的实例,现在应实现 ReactInstanceHolder
。 完成此操作后:
// 1. Provide your ReactInstanceHolder to CodePush.
public class MainApplication extends Application {
@Override
public void onCreate() {
// ... initialize your instance holder
CodePush.setReactInstanceHolder(myInstanceHolder);
super.onCreate();
}
}
若要有效地使用 Staging
我们建议随 CodePush 应用一起创建的 和 Production
部署,请在将应用的 CodePush 使用情况实际移动到生产环境之前,请参阅下面的 多部署测试 文档。
Android) (代码签名设置
从 CLI 版本 2.1.0 开始,可以在发布期间对捆绑包进行自签名,并在安装更新之前验证其签名。 有关代码签名的详细信息,请参阅 相关代码推送文档部分。 若要使用公钥进行代码签名,请执行以下步骤:
将 CodePushPublicKey
字符串项添加到 /path_to_your_app/android/app/src/main/res/values/strings.xml
。 它可能如下所示:
<resources>
<string name="app_name">my_app</string>
<string name="CodePushPublicKey">-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtPSR9lkGzZ4FR0lxF+ZA
P6jJ8+Xi5L601BPN4QESoRVSrJM08roOCVrs4qoYqYJy3Of2cQWvNBEh8ti3FhHu
tiuLFpNdfzM4DjAw0Ti5hOTfTixqVBXTJPYpSjDh7K6tUvp9MV0l5q/Ps3se1vud
M1/X6g54lIX/QoEXTdMgR+SKXvlUIC13T7GkDHT6Z4RlwxkWkOmf2tGguRcEBL6j
ww7w/3g0kWILz7nNPtXyDhIB9WLH7MKSJWdVCZm+cAqabUfpCFo7sHiyHLnUxcVY
OTw3sz9ceaci7z2r8SZdsfjyjiDJrq69eWtvKVUpredy9HtyALtNuLjDITahdh8A
zwIDAQAB
-----END PUBLIC KEY-----</string>
</resources>
对于 React Native <= v0.60,应使用以下方法之一将实例配置为CodePush
使用此参数
使用构造函数
new CodePush(
"deployment-key",
getApplicationContext(),
BuildConfig.DEBUG,
R.string.CodePushPublicKey)
使用生成器
new CodePushBuilder("deployment-key-here",getApplicationContext())
.setIsDebugMode(BuildConfig.DEBUG)
.setPublicKeyResourceDescriptor(R.string.CodePushPublicKey)
.build()
Windows 安装程序
获取 CodePush 插件后,需要将其集成到 React Native 应用的 Visual Studio 项目中并对其进行正确配置。 为此,请采取以下步骤:
React Native版本 0.63.6 及更高版本的插件安装和配置 (Windows)
Windows-npx) (插件安装
下载插件后,在应用程序的根目录中运行 npx react-native autolink-windows
,以自动将 CodePush c++ 项目添加到应用程序的 Windows 解决方案文件。
Windows) (插件配置
将 位于
windows/<app name>
的以下文件替换为位于 的此存储库中的 CodePushDemoAppCpp 示例应用中的文件:Examples/CodePushDemoAppCpp/windows/CodePushDemoAppCpp
:- app.h
- app.cpp
- app.xaml
在上述文件中,将 的
CodePushDemoAppCpp
任意事件替换为应用程序的名称在 中,将应用程序的应用版本和部署密钥输入到
configMap
应用方法App.cpp
顶部的OnLaunched
对象:
//...
void App::OnLaunched(activation::LaunchActivatedEventArgs const& e)
{
winrt::Microsoft::CodePush::ReactNative::CodePushConfig::SetHost(Host());
auto configMap{ winrt::single_threaded_map<hstring, hstring>() };
configMap.Insert(L"appVersion", L"1.0.0");
configMap.Insert(L"deploymentKey", L"<app deployment key>");
winrt::Microsoft::CodePush::ReactNative::CodePushConfig::Init(configMap);
//...
}
//...
适用于低于 0.60 React Native 的插件安装和配置 (Windows)
Windows) (插件安装
打开位于
windows-legacy\<AppName>\<AppName>.sln
应用内的 Visual Studio 解决方案右键单击窗口中的解决方案节点
Solution Explorer
,Add -> Existing Project...
然后选择菜单项浏览到目录
node_modules\react-native-code-push\windows
,选择文件,然后单击OK
返回到 ,
Solution Explorer
右键单击以应用命名的项目节点,然后选择Add -> Reference...
菜单项Projects
选择左侧的选项卡,检查CodePush
项,然后单击OK
Windows) (插件配置
安装插件后,需要将应用配置为为 JS 捆绑包的位置检查 CodePush,因为它将“控制”管理当前和所有未来版本。 为此,请通过以下更改更新 AppReactPage.cs
文件以使用 CodePush:
...
// 1. Import the CodePush namespace
using CodePush.ReactNative;
...
class AppReactPage : ReactPage
{
// 2. Declare a private instance variable for the CodePushModule instance.
private CodePushReactPackage codePushReactPackage;
// 3. Update the JavaScriptBundleFile property to initialize the CodePush runtime,
// specifying the right deployment key, then use it to return the bundle URL from
// CodePush instead of statically from the binary. If you don't already have your
// deployment key, you can run "appcenter codepush deployment list -a <ownerName>/<appName> --displayKeys" to retrieve it.
public override string JavaScriptBundleFile
{
get
{
codePushReactPackage = new CodePushReactPackage("deployment-key-here", this);
return codePushReactPackage.GetJavaScriptBundleFile();
}
}
// 4. Add the codePushReactPackage instance to the list of existing packages.
public override List<IReactPackage> Packages
{
get
{
return new List<IReactPackage>
{
new MainReactPackage(),
...
codePushReactPackage
};
}
}
...
}