React Native客户端 SDK 入门

遵循设置 CodePush 帐户的常规用途"入门"说明后,可以通过在应用的根目录中运行以下命令,开始在 React Native 应用中集成 CodePush:

npm install --save react-native-code-push

与所有其他 React Native 插件一样,iOS 和 Android 的集成体验也不同,因此请遵循安装步骤,具体取决于 (面向) 的平台版本。 请注意,如果面向这两个平台,建议为每个平台创建单独的 CodePush 应用程序。

若要了解其他项目如何与 CodePush 集成,请参阅社区提供的示例应用。 此外,如果想熟悉 CodePush + React Native,请参阅 由"管理 "和 "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 项目中并正确配置。

适用于 iOS React Native 0.60 及 (插件安装和)

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

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

    #import <CodePush/CodePush.h>
    
  3. 找到以下代码行,用于为生产版本设置 bridge 的源 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. 将部署密钥添加到 :若要让 CodePush 运行时知道它应针对哪个部署查询更新,请打开应用的 文件并添加名为 的新条目,其值是要针对 (配置此应用的部署的密钥,例如应用 Info.plist Info.plist) CodePushDeploymentKey Staging FooBar 部署的密钥。 可以通过在 AppCenter 仪表板上访问应用的"分发 UI"或使用 CodePush CLI 运行 来检索此值 (因为默认情况下不会显示键) 并复制与要使用 (的部署对应的列值,请参阅下面的 appcenter codepush deployment list --app <ownerName>/<appName> -k -k Deployment Key) 。 使用部署的名称 (例如暂) 将不起作用。 该"友好名称"仅用于来自 CLI 的经过身份验证的管理使用情况,而不适合在应用中公开使用。

    列表中的部署密钥

    若要有效地使用随 CodePush 应用一起创建的 和 部署,请参阅下面的多部署测试文档,然后实际将 Staging Production 应用的 CodePush使用情况移动到生产环境。

    备注

    如果需要动态使用不同的部署,还可以使用代码推送选项在 JS 代码中重写部署密钥*

用于响应本机低于 0.60 (iOS) 的插件安装

为了容纳尽可能多的开发人员首选项,CodePush 插件支持通过三种机制进行 iOS 安装:

  1. RNPM - 对本机程序包管理器进行响应 (RNPM) 是一种非常丰富的工具,它提供了响应本机插件的最简单安装体验。 如果你已经在使用它,或想要使用它,则建议使用这种方法。

  2. CocoaPods -如果你要构建一个本机 iOS 应用程序,该应用程序将对其进行本机响应,或者你更喜欢使用 CocoaPods,则建议使用我们在我们的插件中随附的 Podspec 文件。

  3. "手动" -如果您不想依赖任何其他工具或使用几个额外的安装步骤, (只需一次) ,就可以使用这种方法。

(iOS 的插件安装-RNPM)

  1. 从0.27 响应的本机,已 rnpm link 合并到响应本机 CLI。 运行:

    react-native link react-native-code-push
    

    如果应用使用的响应版本低于 v 0.27,请执行以下命令:

     rnpm link react-native-code-push
    

    备注

    如果尚未安装 RNPM,可以通过运行 npm i -g rnpm 并执行上述命令来执行此操作。 如果你已安装 RNPM,请确保你已安装了 v 1.9.0 + 才能从此安装步骤中获益。

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

(iOS 的插件安装-CocoaPods)

  1. 将响应的本机和 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 依赖于 Pod,因此,为了确保它可以正确使用生成应用的 React Native 版本,请确保在应用的 中定义依赖项,如 React Native 集成 .podspec React 文档 React Podfile 所说明

iOS (插件安装 - 手动)

  1. 打开应用的 Xcode 项目

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

    将 CodePush 添加到项目

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

  4. 从 拖动到项目的"生成阶段"配置的"将二进制文件与库 libCodePush.a Libraries/CodePush.xcodeproj/Products 链接"部分。

    在生成过程中链接 CodePush

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

    Libz 参考

    备注

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

适用于 iOS React Native 0.60 (插件)

备注

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

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

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

    #import <CodePush/CodePush.h>
    

对于 React Native 0.59 - 0.59.10:

  1. 找到以下代码行,用于为生产版本设置 bridge 的源 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 开发工具、实时重载等。

对于响应本机 0.59-0.59.10:

- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
{
  #if DEBUG
    return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
  #else
    return [CodePush bundleURL];
  #endif
}

对于响应本机0.58 和更低:

NSURL *jsCodeLocation;

#ifdef DEBUG
    jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
#else
    jsCodeLocation = [CodePush bundleURL];
#endif

若要让 CodePush 运行时知道它应查询其更新的部署,请打开项目的 info.plist 文件并添加名为的新项 CodePushDeploymentKey ,其值为要为其配置此应用的部署的密钥, (如 Staging 应用) 的部署的密钥 FooBar 。 你可以通过 appcenter codepush deployment list -a <ownerName>/<appName> --displayKeys 在 CODEPUSH CLI 中运行并复制 Deployment Key 与你要使用的部署相对应的列的值来检索此值 (参见下面) 。 使用部署的名称 (如 Staging) 将不起作用。 "友好名称" 仅适用于 CLI 中经过身份验证的管理使用情况,不适用于应用内的公共使用。

暂存密钥

若要有效地使用随 CodePush 应用一起创建的 和 部署,请参阅下面的多部署测试文档,然后实际将 Staging Production 应用的 CodePush使用情况移动到生产环境。

iOS (HTTP 异常域)

CodePush 插件向以下域提出 HTTPS 请求:

  • codepush.appcenter.ms
  • codepush.blob.core.windows.net
  • codepushupdates.azureedge.net

如果要更改其中任何域的默认 HTTP 安全配置,请定义 (Info.plist) NSAppTransportSecurity 中的 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 (插件)

Android React Native 0.60 及 (插件安装和)

  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 文件添加为 下面的附加生成任务定义 react.gradle

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

    若要让 CodePush 运行时知道哪个部署应查询更新,请打开应用的 strings.xml 文件并添加一个名为的新字符串 CodePushDeploymentKey ,其值为要配置此应用的部署的密钥, (如 Staging 应用) 的部署的密钥 FooBar 。 你可以通过在 App Center CLI 中运行来检索此值 appcenter codepush deployment list -a <ownerName>/<appName> -k (-k 标志是必需的,因为默认情况下不会显示键) 并复制 Key 与你要使用的部署相对应的列的值 (参见下面的) 。 使用部署的名称 (如过渡) 将不起作用。 "友好名称" 仅适用于 CLI 中经过身份验证的管理使用情况,不适用于应用内的公共使用。

    部署列表

    若要有效地使用与 Staging Production CodePush 应用一起创建的和部署,请参阅下面的 多个部署测试 文档,然后将应用的 CodePush 使用投入到生产环境中。

    strings.xml文件应如下所示:

     <resources>
         <string name="app_name">AppName</string>
         <string moduleConfig="true" name="CodePushDeploymentKey">DeploymentKey</string>
     </resources>
    

    备注

    如果需要动态使用不同的部署,还可以使用代码推送选项在 JS 代码中重写部署密钥*

用于响应本机低于 0.60 (Android) 的插件安装

为了容纳尽可能多的开发人员首选项,CodePush 插件通过两种机制支持 Android 安装:

  1. RNPM - 对 本机程序包管理器进行响应 (RNPM)是一种非常丰富的工具,它提供了响应本机插件的最简单安装体验。 如果你已经在使用它,或想要使用它,则建议使用这种方法。

  2. "手动" -如果您不想依赖任何其他工具或使用几个额外的安装步骤, (只需一次) ,就可以使用这种方法。

备注

由于响应本机存储库中的代码发生了更改,因此,如果已安装的响应本机版本范围从0.29 到0.32,我们建议遵循手动设置正确的步骤。

(Android 的插件安装-RNPM)

  1. 从0.27 响应的本机,已 rnpm link 合并到响应本机 CLI。 运行:

    react-native link react-native-code-push
    

    如果应用使用的响应版本低于 v 0.27,请运行以下命令:

    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 文件作为其他生成任务定义添加到下面 react.gradle

    ...
    apply from: "../../node_modules/react-native/react.gradle"
    apply from: "../../node_modules/react-native-code-push/android/codepush.gradle"
    ...
    

用于响应本机低于 0.60 (Android) 的插件配置

备注

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

安装插件并将 Android Studio 项目与 Gradle 同步后,需要将应用配置为在 CodePush 中检查你的 JS 包位置,因为它会 "控制" 管理当前和未来的所有版本。 为此,请按以下步骤操作:

对于响应本机 >= 0.29

如果要将 CodePush 集成到响应本机应用程序,请执行以下步骤:

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,必须先使用 配置 CodePush,然后才能 ReactInstanceHolder 尝试在后台重启实例。 这在你的实现 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();
  }
}

若要有效地使用我们建议随 CodePush 应用一起创建的 和 部署,请参阅下面的多部署测试文档,然后再实际将 Staging 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>

对于响应本机 <= v 0.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 插件后,需要将其集成到响应本机应用的 Visual Studio 项目中,并正确配置它。 为此,请采取以下步骤:

用于响应本机版本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.config
    2. app.config
    3. app.xaml
  2. 在上述文件中,将的所有匹配项替换 CodePushDemoAppCpp 为应用程序的名称

  3. 在中的应用程序方法的顶部,将应用程序的应用版本和部署密钥输入到 configMap 对象 OnLaunchedApp.cpp

//...
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 (Windows) 的插件安装和配置

Windows) (插件安装

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

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

    添加项目

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

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

    添加引用

  5. 选择 Projects 左侧的选项卡,检查项 CodePush ,然后单击 OK

    "添加引用"对话框

Windows (插件)

安装插件后,需要将应用配置为检查 CodePush 中 JS 捆绑包的位置,因为它将"控制"管理当前版本和将来的所有版本。 为此,请通过以下更改更新文件 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
            };
        }
    }
    ...
}