美文网首页ReactNative
React Native 基础之打包

React Native 基础之打包

作者: Kevin_小飞象 | 来源:发表于2019-03-25 10:47 被阅读1次

    Android 平台打包

    借助 Android studio 进行打包的,一次点击 build->generate signed apk。


    image

    如果没有签名文件还需要配置下签名文件。

    image
    此时,你发现的确可以生成一个apk,并且可以安装,但是却无法运行,发生闪退。这是为什么呢?
    这是因为React-Native在android平台下默认没有生成资源文件相关的包(及js的相关资源文件)。所以不管是我们Android平台还是ios平台打包的第一步都需要:导出js bundle包和图片资源。
    导出js bundle包和图片资源
    • 创建一个assets文件放在工程目录下,然后通过命令行生成JS Bundle文件。

    • 生成js bundle文件

    React-native bundle --platform android --dev false --entry-file index.android.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/
    

    如下图:


    image
    • 检查我们项目的assets文件,发现多了bundle文件则说明正确。

    • 然后再次打包,运行,一切正常。

    iOS 平台打包

    1)导出js bundle包和图片资源

    和打包React Native Android应用一样,我们首先也需要对JS部分的代码和图片资源等打包导出,然后通过XCode将其添加到iOS项目中。
    在React Native项目的根目录下执行命令:

    react-native bundle --entry-file index.ios.js --platform ios --dev false --bundle-output release_ios/main.jsbundle --assets-dest release_ios/
    

    通过上述命令,我们就将JS部分的代码和图片资源等打包导出到release_ios目录下。如图所示,项目多了两个文件:ios.jsbundle和ios.jsbundle.meta。


    image

    2)将生成的资源包导入到iOS项目

    选择assets文件夹与main.jsbundle文件将其拖拽到XCode的项目中。然后,修改AppDelegate.m文件,添加如下代码:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
    
      NSURL *jsCodeLocation;
     //jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil];
     +jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
    #endif
    ...
      return YES;
    }
    

    上述代码的作用是,让React Native去使用我们刚才导入的jsbundle。

    注:如果在项目中使用了CodePush热更新,那么我们需要就可以直接通过CodePush来读取本地的jsbundle,代码如下:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
      NSURL *jsCodeLocation;  
    #ifdef DEBUG
        jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil];
    #else
        jsCodeLocation = [CodePush bundleURL];
    #endif
    ...
      return YES;
    }
    

    3)发布iOS应用

    和原生app发布一样,选择选择Product -> Archive。

    相关文章

      网友评论

        本文标题:React Native 基础之打包

        本文链接:https://www.haomeiwen.com/subject/katvvqtx.html