在另一个内部动态编译和 运行 一个反应本机应用程序

Dynamically compiling and running a react-native app inside another

我需要创建一个包含其他应用程序并且可以 运行 它们的移动应用程序。它基本上就像一个 "app center",其中有一个应用程序列表(我们在服务器上发布),用户可以打开其中一个应用程序,从而打开该应用程序。

想想Expo's app,用户可以扫描他的应用程序的二维码,它会自动编译并打开,这接近我想要的功能。

可以打开的应用程序是使用 react-native 创建的,并存储在 Gitlab 的 GIT 个存储库中。

考虑以下示例:

通过启动我们称为 App Center 的应用程序,将显示一个应用程序列表。当用户点击其中之一时,它将在内部打开。


这是一个 "more technical" 示例:

  1. 应用中心启动
  2. 该应用将从服务器获取要显示的应用列表,例如通过调用 https://myappcenterserver.com/all-apps
  3. 它们将被显示并监听新闻事件
  4. 假设用户按下了一个名为 1st App (我知道这是一个非常糟糕的名字) 的应用,其中有 AP123 作为一个 ID
  5. 我们的应用程序将通过调用 https://myappcenterserver.com/app/AP123 向服务器发送请求,这将 returns 来自 Git 存储库的应用程序的 react-native 源代码
  6. 我们的应用中心将编译步骤 5 和 运行 中的代码

所以根据您的说法,我应该考虑哪种方法是最好的。

我应该使用远程代码解决方案,例如 CodePush 还是 react-native-dynamic-bundle ?他们适合这种情况吗?

我只知道 2 种方法,但都不是您想要的。

1 - 在 React Native 中制作所有应用程序并全部放入其中。然后,根据服务器,您将显示 X 个应用程序。

2 - 使用来自 React-Native 的链接。我创建了一个应用程序,其中 1 个功能是 link 它与我创建的另一个应用程序。当我单击按钮时,如果设备中安装了该应用程序,它会尝试打开它,否则,将打开应用程序商店/google 播放,显示要下载的应用程序。

这就是链接的使用方式:https://facebook.github.io/react-native/docs/linking

我知道这不是您所要求的,但我认为您所要求的根本不可能。

这部分可以通过 CodePush 实现:

  • 为不同的应用创建多个CodePush 环境。 (APP1 APP2 等)
  • 当您启动您的应用程序时,进行 API 调用以获取应用程序列表和相应的代码推送部署密钥。
  • 点击按钮codepush.sync(deployment_key) → 重启应用然后直接跳转到你的应用(可能将应用名称存储在AsyncStorage中并通过导航直接跳转到它)

但是,警告可能会破坏交易:

  • 您的应用将在选择应用后重新加载
  • 主要的 React 版本升级(本机 java/oc 更改)将需要商店发布,因为它无法通过 JS 处理(可能不会破坏交易)

还有更好的方法:

  • 创建一个容器应用程序和一个 CodePush 环境
  • 拥有像[{app:"A1", version: 2.0.0}, {app: "A2", version: 1.2.0}]
  • 这样的中央配置
  • 所有其他应用程序 A1、A2、A3 公开对象,这些对象可以作为插件公开给容器应用程序。
  • 您的 CI 处理从多个存储库动态构建应用程序(或更好 - 由不同存储库生成的多个 npm 包)并将 JS 推送到 CodePush 服务器。
  • 它将配置中的所有应用程序(bash 脚本添加到 yarn add A1、yarn add a2、yarn add a3)到容器,
  • 您的应用读取配置并加载 A1 A2 等
  • CD 创建新的 CodePush 版本。

只要中央配置发生变化(比如在 A1 发布 npm 包后他们更新中央配置),就会重复此操作。

它解决了重新启动的问题,因为您已将所有捆绑包构建为一个。

代码推送: https://docs.microsoft.com/en-us/appcenter/distribution/codepush/react-native#dynamic-deployment-assignment

或者你可能想通过 expo 的代码 https://github.com/expo/expo/blob/d56076241cef55b0a93a5c0bb8dc690270e42dcb/home/screens/QRCodeScreen.android.js#L89