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 BudhaniDeepak 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)

  1. 运行 cd ios && pod install && cd .. 以安装所有必要的 CocoaPods 依赖项。

  2. 打开 AppDelegate.m 文件,并为 CodePush 标头添加 import 语句:

    #import <CodePush/CodePush.h>
    
  3. 查找以下代码行,用于设置生产版本的网桥的源 URL:

    return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
    
  4. 将其替换为以下行:

    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
    }
    
  5. 将部署密钥添加到 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 安装:

  1. RNPM - React Native包管理器 (RNPM) 是一款出色的工具,可为React Native插件提供最简单的安装体验。 如果你已在使用它,或者你想要使用它,我们建议使用此方法。

  2. CocoaPods - 如果要构建嵌入React Native的本机 iOS 应用,或者更喜欢使用 CocoaPods,我们建议使用作为插件的一部分随附的 Podspec 文件。

  3. “手动” - 如果不想依赖任何其他工具,或者无需执行一些额外的安装步骤, (这是一次性) ,请使用此方法。

iOS (插件安装 - RNPM)

  1. 从 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+,以便从此一步安装中受益。

  2. 系统将提示你输入要使用的部署密钥。 如果还没有此值,可以通过运行 appcenter codepush deployment list -a <ownerName>/<appName> --displayKeys来检索此值,也可以选择 (忽略它,方法是点击 <ENTER>) ,稍后再将其添加到中。 若要开始,建议使用 Staging 部署密钥,以便可以端到端测试 CodePush。

iOS (插件安装 - CocoaPods)

  1. 将 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 或更高版本

  2. 运行 pod install

注意

CodePush .podspec 依赖于 React Pod,因此为了确保它可以正确使用生成应用的 React Native 版本,请确保按照React Native集成文档中的说明在应用中Podfile定义React依赖项。

iOS (插件安装 - 手动)

  1. 打开应用的 Xcode 项目

  2. CodePush.xcodeprojnode_modules/react-native-code-push/ios在目录中找到文件 (或 node_modules/react-native-code-push =1.7.3-beta<安装) ,并将其拖动到 Libraries Xcode 中的节点

    将 CodePush 添加到项目

  3. 在 Xcode 中选择项目节点,然后选择项目配置的“生成阶段”选项卡。

  4. Libraries/CodePush.xcodeproj/ProductslibCodePush.a到项目的“生成阶段”配置的“链接二进制文件”部分。

    在生成过程中链接 CodePush

  5. 单击“将二进制文件与库链接”列表下面的加号,然后选择 libz.tbd 节点下的 iOS 9.1 库。

    Libz 参考

    注意

    或者,如果愿意,可以将 标志添加到 -lzOther Linker Flags 部分的 Build Settings字段中Linking

iOS) 低于 0.60 (React Native 插件配置

注意

如果使用 RNPM 或 react-native link 自动链接插件,则这些步骤已为你完成,因此可以跳过此部分。

将 Xcode 项目设置为生成/链接 CodePush 插件后,需要将应用配置为针对 JS 捆绑包的位置检查 CodePush,因为它负责将其与发布到 CodePush 服务器的更新同步。 为此,请按照下列步骤进行操作:

  1. 打开 AppDelegate.m 文件,并为 CodePush 标头添加 import 语句:

    #import <CodePush/CodePush.h>
    

对于 React Native 0.59 - 0.59.10:

  1. 查找以下代码行,用于设置生产版本的网桥的源 URL:

    return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
    
  2. 将其替换为以下行:

    return [CodePush bundleURL];
    

对于 React Native 0.58 及更低版本:

  1. 查找以下代码行,用于从应用二进制文件加载 JS 捆绑包以用于生产版本:

    jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
    
  2. 将其替换为以下行:

    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)

  1. 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')
    
  2. 在文件中 android/app/build.gradle ,将 codepush.gradle 文件添加为附加的生成任务定义:

    ...
    apply from: "../../node_modules/react-native-code-push/android/codepush.gradle"
    ...
    
  3. 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();
            }
        };
    }
    
  4. 将部署密钥添加到 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 安装:

  1. RNPM - React Native包管理器 (RNPM) 是一款出色的工具,可为React Native插件提供最简单的安装体验。 如果你已在使用它,或者想要使用它,我们建议使用此方法。

  2. “手动” - 如果你不想依赖任何其他工具,或者无需执行一些额外的安装步骤, (这是一次性) ,则采用此方法。

注意

由于 React Native 存储库中的代码发生了更改,如果安装的React Native版本范围为 0.29 到 0.32,建议按照手动步骤正确设置。

Android (插件安装 - RNPM)

  1. 自 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 并执行上述命令来执行此操作。

  2. 如果使用 RNPM >=1.6.0,系统会提示你输入要使用的部署密钥。 如果还没有此值,可以通过运行 appcenter codepush deployment list -a <ownerName>/<appName> --displayKeys来检索此值,也可以选择通过点击 <ENTER>) (忽略此值,稍后再将其添加到中。 若要开始,建议使用 Staging 部署密钥,以便可以端到端测试 CodePush。

这就是使用 RNPM 进行安装! 继续执行以下 插件配置 部分以完成设置。

Android (插件安装 - 手动)

  1. 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')
    
  2. android/app/build.gradle在文件中,将:react-native-code-push项目添加为编译时依赖项:

    ...
    dependencies {
        ...
        compile project(':react-native-code-push')
    }
    
  3. 在文件中 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) (插件配置

  1. 将 位于 windows/<app name> 的以下文件替换为位于 的此存储库中的 CodePushDemoAppCpp 示例应用中的文件: Examples/CodePushDemoAppCpp/windows/CodePushDemoAppCpp

    1. app.h
    2. app.cpp
    3. app.xaml
  2. 在上述文件中,将 的 CodePushDemoAppCpp 任意事件替换为应用程序的名称

  3. 在 中,将应用程序的应用版本和部署密钥输入到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) (插件安装

  1. 打开位于 windows-legacy\<AppName>\<AppName>.sln 应用内的 Visual Studio 解决方案

  2. 右键单击窗口中的解决方案节点 Solution ExplorerAdd -> Existing Project... 然后选择菜单项

    添加项目

  3. 浏览到目录 node_modules\react-native-code-push\windows ,选择文件,然后单击 OK

  4. 返回到 , Solution Explorer右键单击以应用命名的项目节点,然后选择 Add -> Reference... 菜单项

    添加引用

  5. 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
            };
        }
    }
    ...
}