javascript - 在另一个内部动态编译和运行 native react 应用程序

标签 javascript react-native compilation code-push

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

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

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

考虑以下示例:

Sketch image of the desired app

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


这是一个“更技术性”的例子:

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

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

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

最佳答案

这部分可以通过 CodePush 实现:

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

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

  • 您的应用将在选择应用后重新加载
  • 主要的 React 版本升级( native 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 包后他们更新中央配置),就会重复此操作。

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

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

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

关于javascript - 在另一个内部动态编译和运行 native react 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57252070/

相关文章:

android - React Native 是否解决了正确的痛点?

javascript - 如何使用 Push.js 将数据和变量传递到新页面

javascript - jqGrid:列调整大小触发点击事件

javascript - 如何创建 Angular Electron 应用程序的 deb 或 exe 文件

c++ - C++ 的简单生成文件

java - 这些构造之间有什么区别,以至于无法编译?

c# - 使用 exe 编译非托管 DLL

javascript - React setState(null) 并强制更新

javascript - 如何向 PHP 元素发送 post 请求

javascript - 为什么 render() 在 React Native 中被调用两次?