在另一个内部动态编译和 运行 一个反应本机应用程序
Dynamically compiling and running a react-native app inside another
我需要创建一个包含其他应用程序并且可以 运行 它们的移动应用程序。它基本上就像一个 "app center",其中有一个应用程序列表(我们在服务器上发布),用户可以打开其中一个应用程序,从而打开该应用程序。
想想Expo's app,用户可以扫描他的应用程序的二维码,它会自动编译并打开,这接近我想要的功能。
可以打开的应用程序是使用 react-native 创建的,并存储在 Gitlab 的 GIT 个存储库中。
考虑以下示例:
通过启动我们称为 App Center 的应用程序,将显示一个应用程序列表。当用户点击其中之一时,它将在内部打开。
这是一个 "more technical" 示例:
- 应用中心启动
- 该应用将从服务器获取要显示的应用列表,例如通过调用 https://myappcenterserver.com/all-apps
- 它们将被显示并监听新闻事件
- 假设用户按下了一个名为 1st App (我知道这是一个非常糟糕的名字) 的应用,其中有 AP123 作为一个 ID
- 我们的应用程序将通过调用 https://myappcenterserver.com/app/AP123 向服务器发送请求,这将 returns 来自 Git 存储库的应用程序的 react-native 源代码
- 我们的应用中心将编译步骤 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 包后他们更新中央配置),就会重复此操作。
它解决了重新启动的问题,因为您已将所有捆绑包构建为一个。
或者你可能想通过 expo 的代码 https://github.com/expo/expo/blob/d56076241cef55b0a93a5c0bb8dc690270e42dcb/home/screens/QRCodeScreen.android.js#L89
我需要创建一个包含其他应用程序并且可以 运行 它们的移动应用程序。它基本上就像一个 "app center",其中有一个应用程序列表(我们在服务器上发布),用户可以打开其中一个应用程序,从而打开该应用程序。
想想Expo's app,用户可以扫描他的应用程序的二维码,它会自动编译并打开,这接近我想要的功能。
可以打开的应用程序是使用 react-native 创建的,并存储在 Gitlab 的 GIT 个存储库中。
考虑以下示例:
通过启动我们称为 App Center 的应用程序,将显示一个应用程序列表。当用户点击其中之一时,它将在内部打开。
这是一个 "more technical" 示例:
- 应用中心启动
- 该应用将从服务器获取要显示的应用列表,例如通过调用 https://myappcenterserver.com/all-apps
- 它们将被显示并监听新闻事件
- 假设用户按下了一个名为 1st App (我知道这是一个非常糟糕的名字) 的应用,其中有 AP123 作为一个 ID
- 我们的应用程序将通过调用 https://myappcenterserver.com/app/AP123 向服务器发送请求,这将 returns 来自 Git 存储库的应用程序的 react-native 源代码
- 我们的应用中心将编译步骤 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 包后他们更新中央配置),就会重复此操作。
它解决了重新启动的问题,因为您已将所有捆绑包构建为一个。
或者你可能想通过 expo 的代码 https://github.com/expo/expo/blob/d56076241cef55b0a93a5c0bb8dc690270e42dcb/home/screens/QRCodeScreen.android.js#L89