react-native - 解决与项目根目录外的 native 包文件相关的 Assets

标签 react-native code-push react-native-code-push

问题(android):如果捆绑文件位于项目根目录之外,则将图像 Assets 相对于 js 捆绑文件放在哪里?

我们有一个小型服务,我们在每次构建时上传 JS 包。因此,例如我们有应用程序 com.example ,如果我们想更新我们的应用程序(当应用程序审查在应用程序商店中等待时),那么我们:

  • 将 JS 包下载到 android 路径 /data/data/com.example/files/bundle/android.bundle
  • 通过 https://github.com/mauritsd/react-native-dynamic-bundle 将此捆绑包设置为事件状态

  • 想象一下,在 react App 组件中,我们有一个路径为 star.png 的图像。 .

    当我们激活新捆绑包时,不会显示星形图像。

    我已经通过 https://reactnative.dev/docs/image#resolveassetsource 检查了图像路径在发布版本中,图像 uri 仅解析为 star .

    所以我尝试了以下文件结构:

    №1
    data
    --data
    ----com.example
    ------files
    --------bundle
    ----------android.bundle <= dynamic bundle from remote server
    ----------star // <= our image
    

    2号
    data
    --data
    ----com.example
    ------files
    --------bundle
    ----------android.bundle <= dynamic bundle from remote server
    ----------star.png // <= our image
    

    但是如果捆绑文件在项目根目录之外,则不会显示静止图像。

    问题:
  • 我究竟做错了什么? https://github.com/Microsoft/react-native-code-push以某种方式设法解决了它。
  • ios 解决方案是否与 android 相同?

  • 提前致谢

    最佳答案

    捆绑 Assets 应放置在 js 捆绑文件所在的同一文件夹中(仅在 android 上测试)。

    您始终可以通过 https://reactnative.dev/docs/image#resolveassetsource 获取捆绑 Assets 路径.

    如何测试:

  • 放一张图片 star.png到项目根目录。
  • 使用以下代码创建一个 React Native 应用程序:
  • import React from 'react';
    import {
      SafeAreaView,
      Text,
      StatusBar,
      Image
    } from 'react-native';
    import Star from './star.png';
    
    const App: () => React$Node = () => {
    
      const r = Image.resolveAssetSource(Star);
      console.log(r);
    
      return (
        <>
          <StatusBar barStyle="dark-content" />
          <SafeAreaView>
            <Text>TestAssetsApp</Text>
            <Image
              style={{width: 50, height: 50}}
              source={Star}
            />
          </SafeAreaView>
        </>
      );
    };
    
    export default App;
    
    
  • 在您的 MainApplication.java 中设置捆绑路径(我的应用程序包名为 com.testassetsapp ):
  • public class MainApplication extends Application implements ReactApplication {
    
      private final ReactNativeHost mReactNativeHost =
          new ReactNativeHost(this) {
            @Override
            public boolean getUseDeveloperSupport() {
              return BuildConfig.DEBUG;
            }
    
            @Override
            protected List<ReactPackage> getPackages() {
              @SuppressWarnings("UnnecessaryLocalVariable")
              List<ReactPackage> packages = new PackageList(this).getPackages();
              // Packages that cannot be autolinked yet can be added manually here, for example:
              // packages.add(new MyReactNativePackage());
              return packages;
            }
    
            @Override
            protected String getJSMainModuleName() {
              return "index";
            }
    
            // Add this method
            @Override
            protected String getJSBundleFile() {
              return "/data/data/com.testassetsapp/files/android.bundle";
            }
          };
    
  • 通过以下方式创建 android JS 包和 Assets :
  • react-native bundle --platform android --dev false --entry-file index.js --bundle-output android.bundle --assets-dest assets
    
  • 通过以下方式安装调试版本:
  • cd android && ./gradlew installDebug
    

    注意:仅通过 ./gradlew installDebug 进行测试没有运行地铁打包器 因为它总是重写包路径。

    现在,如果您运行该应用程序,您将收到错误“未找到捆绑包”。
  • 上传 android.bundle文件到 /data/data/com.testassetsapp/files/android.bundle

  • 现在,如果您运行该应用程序,它应该会启动。但星图尚未显示。
  • assets 上传捆绑文件文件夹到 /data/data/com.testassetsapp/files所以应用程序数据结构应该如下:
    enter image description here

  • 现在,如果您重新启动应用程序,应显示星形图像。

    关于react-native - 解决与项目根目录外的 native 包文件相关的 Assets ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60896279/

    相关文章:

    javascript - AsyncStorage.getItem() 返回一个值和一个 promise

    javascript - 切换按钮处于关闭状态,但其值为 true

    javascript - iOS codePush.sync() 上的 Cordova 的 CodePush 似乎不起作用

    react-native - 部署 key 为空 appcenter 代码推送 cli

    react-native - 如何通过代码推送成功更新应用程序后显示通知

    ios - Codepush - js 和 css 文件(来自 Assets )未加载到设备中

    react-native - 如何在 React Native 中对齐标签和输入?

    javascript - React Native - 编辑代码推送目标/版本号(在应用程序中)

    docker - 无法注册代码推送

    javascript - 无法在 React Native 中使用新的 Textinput 数据更新 Array 对象