全部产品

管理离线包

更新时间:2020-10-28 17:28:40

传统的在线 H5 技术容易受到网络环境影响,从而影响 H5 页面的性能。为此,您可以将不同的业务封装打包成一个离线包,通过发布平台下发对客户端资源进行更新。

本文将引导您管理离线包:

前置条件

您需要确保完成 SDK 添加后,客户端工程已集成 NebulamPaaSBiz.framework

生成离线包

为了生成 .amr 离线包, 您需要构建前端 .zip 包并在线生成 .amr 包。具体的操作步骤,请参见文档 生成离线包

加载离线包

根据是否在客户端预置离线包,分为以下两种方式:

预置离线包

不管网络情况如何,首页或登录页等页面都需快速加载。因此,可以将这部分资源打包为离线包、提前预置在工程中,以保证在离线情况下资源也能快速加载。

具体步骤如下:

  1. 新建一个独立的 bundle,如 DemoCustomPresetApps.bundle,将从发布平台下载的 .amr 离线包和 h5_json.json 文件添加到此 bundle 中。
    111

    重要:目前发布平台仅支持下载单个离线包的 h5_json.json 配置文件。当预置多个离线包时,需要手动合并到 JSON 文件中的 data 数组。
  2. 在初始化容器时,调用 initNebulaWithCustomPresetApplistPath 接口,设置预置离线包路径为上一步中创建的 bundle。

    1. - (void)application:(UIApplication *)application beforeDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    2. {
    3. // 初始化 rpc
    4. [MPRpcInterface initRpc];
    5. // 初始化容器
    6. // [MPNebulaAdapterInterface initNebula];
    7. // 自定义jsapi路径和预置离线包信息
    8. NSString *presetApplistPath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"DemoCustomPresetApps.bundle/h5_json.json"] ofType:nil];
    9. NSString *appPackagePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"DemoCustomPresetApps.bundle"] ofType:nil];
    10. NSString *pluginsJsapisPath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"DemoCustomPlugins.bundle/Poseidon-UserDefine-Extra-Config.plist"] ofType:nil];
    11. [MPNebulaAdapterInterface initNebulaWithCustomPresetApplistPath:presetApplistPath customPresetAppPackagePath:appPackagePath customPluginsJsapisPath:pluginsJsapisPath];
    12. }
  3. 与加载非预置离线包类似,进入对应的页面时,调用 Nebula 容器提供的接口方法加载离线包。
    1. - (void)openPresetPackage {
    2. [[MPNebulaAdapterInterface shareInstance] startH5ViewControllerWithNebulaApp:@{@"appId":@"20180910"}];
    3. }

加载远程离线包

除将离线包预置在客户端外,您还可以通过发布平台动态发布一个离线包。此时,客户端直接加载远程离线包,可以避免因预置大量离线包而使得客户端包体积过大。

具体步骤如下:

  1. 在应用启动完成后,可以预加载获取包信息并下载离线包,防止打开离线包时白屏。

    • 代码示例

      1. [[MPNebulaAdapterInterface shareInstance] requestAllNebulaApps:^(NSDictionary *data, NSError *error) {
      2. NSLog(@"[mpaas] nebula rpc data :%@", data);
      3. }];
    • 接口方法

      1. @interface MPNebulaAdapterInterface : NSObject
      2. /**
      3. * 全量更新本地离线包信息
      4. *
      5. * @param finish 完成回调
      6. *
      7. */
      8. - (void)requestAllNebulaApps:(NAMRequestFinish)finish;
      9. /**
      10. * 单个应用请求
      11. *
      12. * @param params 请求列表,格式为{appid:version}。可传多个 appid。版本号最长 4 位,如 1.0.0.1;不指定 version 时传空,默认取最高版本;支持版本号模糊匹配,如: '*' 匹配最高版本号、'1.*' 匹配以 1 开头的版本号中最高的版本号
      13. * @param finish 完成回调
      14. */
      15. - (void)requestNebulaAppsWithParams:(NSDictionary *)params finish:(NAMRequestFinish)finish;
      16. @end
  2. 客户端配置完成后,您可以通过发布平台下发一个离线包,具体的操作步骤,请参见 实时发布 > 离线包管理 > 发布离线包

  3. 进入对应的页面时,调用 Nebula 容器提供的接口方法加载离线包,即可看到您在发布平台下发的离线包。

    • 代码示例

      1. - (void)openPresetPackage {
      2. [[MPNebulaAdapterInterface shareInstance] startH5ViewControllerWithNebulaApp:@{@"appId":@"20180910"}];
      3. }
    • 接口方法

      1. @interface MPNebulaAdapterInterface : NSObject
      2. /**
      3. * 基于传入的离线包信息,创建一个 H5 容器,并自动 push 打开
      4. *
      5. * @param params H5 容器的启动参数,必填参数:appId,其他可选参数参考文档 https://tech.antfin.com/docs/2/85001
      6. *
      7. */
      8. - (void)startH5ViewControllerWithNebulaApp:(NSDictionary *)params;
      9. @end

利用全局资源包

Nebula 全局资源包解决多个 H5 应用使用同一资源产生的冗余问题,如 React 应用使用 ReactJS 框架代码。您可以将公共资源放入全局资源包,以降低 H5 应用体积。您可以在 afterDidFinishLaunchingWithOptions 方法中配置全局离线包,如下文示例代码,其中 77777777 为全局资源包的 appId。

nebulaCommonResourceAppList 用于告知 H5 容器指定 ID 的离线包将作为全局资源包使用。如果您没有配置此 ID,即使内置该离线包,也不会生效。

  1. ```
  2. - (void)application:(UIApplication *)application afterDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions
  3. {
  4. [MPNebulaAdapterInterface shareInstance].nebulaCommonResourceAppList = @[@"77777777"];// 设置全局资源包
  5. }
  6. ```

通常情况下为了提高页面的加载速度,建议预置全局资源包,后续依然可以通过 H5 应用后台下发更新。

动态更新离线包

mPaaS 提供强大的动态更新能力,您可以通过发布平台下发一个新版本的离线包,来更新客户端的对应页面。具体的操作步骤,请参见 实时发布 > 离线包管理 > 发布离线包

相关链接