在客户端预置 iOS 小程序

传统的小程序技术容易受到网络环境影响,当网络质量不佳时可能拉取不到小程序包。通过预置小程序即可规避该问题。本文介绍了预置小程序的原理和预置小程序的实现过程。

什么是预置小程序

预置小程序是指将小程序的渲染、逻辑、配置等静态资源打包在一个压缩包内,客户端预先下载小程序包到本地,并直接从本地加载资源的过程。预置小程序可以最大程度地摆脱网络环境对 mPaaS 小程序页面的影响。使用预置包可带来以下优势:

  • 提升用户体验 通过预置包的方式把页面内静态资源嵌入到应用中并随应用一起发布,可使用户第一次打开应用时无需依赖网络环境去下载资源,可直接开始使用。

  • 实现动态更新 在推出新版本或紧急发布时,可以在小程序 IDE 中进行迭代开发,通过 mPaaS 控制台发布,客户端中集成的小程序 SDK 会自动将小程序更新到最新的版本。这种发布无需通过应用商店审核,可以让用户及早接收到更新。

前提条件

您已接入小程序组件。更多关于小程序组件的接入信息,请参见 快速开始使用小程序

操作步骤

  1. 预置小程序包。

    1. 在 mPaaS 控制台发布小程序包并下载 AMR 文件和配置文件。

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

      说明

      目前发布平台仅支持下载单个离线包的 h5_json.json 配置文件。当预置多个小程序包时,需要将不同 h5_json.json 中的 data 数据手动合并到一个配置文件中。

    3. 初始化小程序时,在 initNebulaWithCustomPresetApplistPath 接口中设置预置小程序离线包路径为上一步中创建的 bundle。

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

    [MPNebulaAdapterInterface startTinyAppWithId:@"2020121720201217" params:nil];
  3. 更新小程序。默认情况下,每次打开应用,小程序 SDK 都会尝试检查是否有可更新的版本。出于减少服务端压力的考虑,该检查有时间间隔限制,默认为 30 分钟。如果想立即检查最新可用版本,可调用下方的代码来请求更新。一般情况下,可以在应用启动或者用户登录后调用。

    -(void)application:(UIApplication *)application afterDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
     //全量更新本地小程序包信息
     [[MPNebulaAdapterInterface shareInstance] requestAllNebulaApps:^(NSDictionary *data, NSError *error) {
         NSLog(@"[mpaas] nebula rpc data :%@", data);
     }];
    }
  4. 校验安全签名。小程序具有签名校验机制,防止恶意程序篡改下载到设备的小程序包。通过调用小程序接口设置验签参数即可开启此机制。

    说明

    • 请在第一次打开小程序包前调用 MPNebulaAdapterInterface 接口,否则将会导致公钥初始化失败。关于公钥与私钥,请参见 配置小程序包 > 密钥管理

    • 开启验签。

      [MPNebulaAdapterInterface shareInstance].nebulaNeedVerify = YES;
  5. 删除本地小程序。Nebula 提供了删除本地应用信息的接口。当本地应用信息被删除后,再次打开应用时会重新请求服务端下载、更新本地小程序的信息。

    /**
    *  @brief 删除本地应用信息(包括包信息、amr以及安装目录)
    *
    *  @date 2019-02-28
    *
    *  @return
    */
    -(void)clearAllAppInfo:(NSString *)appId;
    //使用方法
    [[NBServiceGet() appCenter] clearAllAppInfo:@"2020199503242811"];