全部产品
云市场

使用 SDK(版本 ≥ 10.1.60)

更新时间:2020-07-03 20:19:34

本文将结合 H5容器和离线包 官方 Demo 来介绍10.1.60 以上版本的基线中 H5 容器 SDK 的使用。

初始化容器

启动容器

  • 为了使用 Nebula 容器,您需要在程序启动完成后调用 SDK 接口,对容器进行初始化。初始化必须在 DTFrameworkInterface- (void)application:(UIApplication *)application beforeDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions 中进行。

    1. - (void)application:(UIApplication *)application beforeDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    2. {
    3. // 初始化容器
    4. [MPNebulaAdapterInterface initNebula];
    5. }
  • 若您需要使用 预置离线包自定义 JSAPIPlugin 等功能,请将上方代码中的 initNebula 接口替换为下方代码中的 initNebulaWith 接口,传入对应参数对容器进行初始化。

    • presetApplistPath:自定义的预置离线包的包信息路径。
    • appPackagePath:自定义的预置离线包的包路径。
    • pluginsJsapisPath:自定义 JSAPI 和 Plugin 文件的存储路径。
      1. - (void)application:(UIApplication *)application beforeDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions
      2. {
      3. // 初始化容器
      4. NSString *presetApplistPath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"MPCustomPresetApps.bundle/h5_json.json"] ofType:nil];
      5. NSString *appPackagePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"MPCustomPresetApps.bundle"] ofType:nil];
      6. NSString *pluginsJsapisPath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"Poseidon-UserDefine-Extra-Config.plist"] ofType:nil];
      7. [MPNebulaAdapterInterface initNebulaWithCustomPresetApplistPath:presetApplistPath customPresetAppPackagePath:appPackagePath customPluginsJsapisPath:pluginsJsapisPath];
      8. }
      说明initNebulainitNebulaWithCustomPresetApplistPath 是两个并列的方法,不要同时调用。

定制容器

  • 如有需要,您可以通过设置 MPNebulaAdapterInterface 的属性值来定制容器配置。必须在 DTFrameworkInterface- (void)application:(UIApplication *)application afterDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions 中设置,否则会被容器默认配置覆盖。

    1. - (void)application:(UIApplication *)application afterDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    2. {
    3. // 定制容器
    4. [MPNebulaAdapterInterface shareInstance].nebulaVeiwControllerClass = [MPH5WebViewController class];
    5. [MPNebulaAdapterInterface shareInstance].nebulaNeedVerify = NO;
    6. [MPNebulaAdapterInterface shareInstance].nebulaUserAgent = @"mPaaS/Portal";
    7. [MPNebulaAdapterInterface shareInstance].nebulaCommonResourceAppList = @[@"77777777"];
    8. }
  • 属性含义如下:

    名称 含义 备注
    nebulaVeiwControllerClass H5 页面的基类 默认为 H5WebViewController。若需指定所有 H5 页面的基类,可直接设置此接口。注意:基类必须继承自 H5WebViewController。
    nebulaWebViewClass 设置 WebView 的基类 > 10.1.60:默认为 H5WKWebView。自定义的 WebView 必须继承 H5WKWebView。
    = 10.1.60:不支持自定义。
    nebulaUseWKArbitrary 设置是否使用 WKWebView 加载离线包页面 > 10.1.60:默认为 YES。
    = 10.1.60:默认为 NO。
    nebulaUserAgent 设置应用的 UserAgent 设置的 UserAgent 会作为后缀添加到容器默认的 UA 上。
    nebulaNeedVerify 是否验签,默认为 YES 配置离线包 时未上传私钥文件,此值需设为 NO,否则离线包加载失败。
    nebulaPublicKeyPath 离线包验签的公钥路径 配置离线包 时上传的私钥对应的公钥路径。
    nebulaCommonResourceAppList 公共资源包的 appId 列表 -
    errorHtmlPath 当 H5 页面加载失败时展示的 HTML 错误页路径 默认读取 MPNebulaAdapter.bundle/error.html
    configDelegate 设置自定义开关 delegate 提供全局修改容器默认开关值的能力。

更新离线包

启动完成后,全量请求所有离线包信息,检查服务端是否有更新包。为了不影响应用启动速度,建议在 (void)application:(UIApplication \*)application afterDidFinishLaunchingWithOptions:(NSDictionary \*)launchOptions 之后调用。

  1. - (void)application:(UIApplication *)application afterDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions
  2. {
  3. // 定制容器
  4. [MPNebulaAdapterInterface shareInstance].nebulaVeiwControllerClass = [MPH5WebViewController class];
  5. [MPNebulaAdapterInterface shareInstance].nebulaNeedVerify = NO;
  6. [MPNebulaAdapterInterface shareInstance].nebulaUserAgent = @"mPaaS/Portal";
  7. [MPNebulaAdapterInterface shareInstance].nebulaCommonResourceAppList = @[@"77777777"];
  8. // 全量更新离线包
  9. [[MPNebulaAdapterInterface shareInstance] requestAllNebulaApps:^(NSDictionary *data, NSError *error) {
  10. NSLog(@"");
  11. }];
  12. }

初始化完成后,效果如下:

after initialization

非框架托管配置

如下图所示,若您 App 的生命周期并没有交给 mPaaS 框架托管,而是指定为您自定义的 delegate,那么还需进行额外配置。若是 mPaaS 框架托管,可跳过此步骤。

non-framework

启动 mPaaS 框架

在当前应用的 didFinishLaunchingWithOptions 方法中调用 [[DTFrameworkInterface sharedInstance] manualInitMpaasFrameworkWithApplication:application launchOptions:launchOptions]; 来启动 mPaaS 框架。

launch-mpaas

说明:启动框架必须在当前应用 windownavigation 初始化完成后调用,否则无法生效。

创建应用启动器

创建继承 DTBootLoader 的子类,重写 createWindowcreateNavigationController 方法,返回当前应用自己的 windownavigationControlle

  • 设置 window:当前应用的 keyWindow。
  • 设置 navigationController:当前应用 keyWindow 的 rootviewcontroller,必须继承 DFNavigationController

bootloader

bootloader_m

指定应用启动器

DTFrameworkInterfacecategory 中重写方法,指定当前应用自己的 bootloader,并隐藏 mPaaS 框架默认的 windowlauncher 应用。

interface

唤起容器

容器初始化完成后,就可以唤起一个 H5 容器。分为以下三种情况:

  • 基于在线 URL 或本地 HTML 文件,创建一个 H5 容器。 示例代码如下:

    1. // 打开在线 URL
    2. [[MPNebulaAdapterInterface shareInstance] startH5ViewControllerWithParams:@{@"url": @"https://tech.antfin.com/products/MPAAS"}];
    3. // 打开本地 HTML 页面
    4. NSString *path = [[NSBundle mainBundle].bundlePath stringByAppendingFormat:@"/%@/%@", @"MPH5Demo.bundle", @"H52Native.html"];
    5. if ([path length] > 0) {
    6. [[MPNebulaAdapterInterface shareInstance] startH5ViewControllerWithParams:@{@"url": path}];
    7. }
  • 基于传入的离线包信息,创建一个 H5 容器,并自动 push 打开。示例代码如下:

    1. [[MPNebulaAdapterInterface shareInstance] startH5ViewControllerWithNebulaApp:@{@"appId":@"90000000"}];
  • 基于传入的离线包信息,创建一个 H5 容器,并返回创建的 H5 容器实例(一般用在首页 tab 页面)。 示例代码如下:

    1. [[MPNebulaAdapterInterface shareInstance] createH5ViewControllerWithNebulaApp:@{@"appId":@"90000000"}];

实现 H5 与 Native 双向通信

您可以通过调用 JSAPI 和监听特定事件来实现 H5 与 Native 双向通信。

在 H5 页面调用 Native 功能

您可以通过调用 JSAPI 来实现 H5 到 Native 的通信。

Nebula 容器支持的 JSAPI 及相关参数说明,请参见 内置 JSAPI

示例

调用 JSAPI 接口 pushWindow,实现“在 H5 页面点击某个按钮时,加载一个新页面”的需求:

  1. AlipayJSBridge.call('pushWindow', {
  2. url: 'https://tech.antfin.com',
  3. param: {
  4. readTitle: true,
  5. defaultTitle: true,
  6. // ...
  7. }
  8. }, function(data) {alert('调用结果'+JSON.stringify(data)); });

AlipayJSBridge 说明

AlipayJSBridge 是 Nebula 容器自动注入的 JSBridge。在 Window.onload 以后,容器会生成一个全局变量 AlipayJSBridge,然后触发 AlipayJSBridgeReady 事件。AlipayJSBridge 注入是一个异步过程,因此需要先监听 AlipayJSBridgeReady 事件再调用接口。

示例代码如下:

  1. <h1>bridge 使用方法</h1>
  2. <script>
  3. function ready(callback) {
  4. if (window.AlipayJSBridge) {
  5. callback && callback();
  6. } else {
  7. document.addEventListener('AlipayJSBridgeReady', callback, false);
  8. }
  9. }
  10. ready(function(){
  11. alert('bridge ready');
  12. });
  13. </script>

在 Native 页面调用 H5 功能

您可以通过监听特定事件来实现 Native 到 H5 的通信。Nebula 容器支持的事件列表,参见 事件扩展

  1. document.addEventListener('back', function (e) {
  2. if(confirm('back已拦截,是否确定返回?')) {
  3. // do something;
  4. }
  5. }, false);

除了 Nebula 容器默认支持的事件外,您还可以在 Native 端通过以下方式自定义事件让前端来监听。

  1. // self: 当前 H5 页面所在的 VC
  2. // data:native 传递给前端的参数
  3. // callBack:前端收到事件后的回调
  4. [self callHandler:@"customEvent" data:@{@"key":@"value"} responseCallback:^(id responseData) {
  5. NSLog(@"前端收到事件后的回调: %@", responseData);
  6. }];

扩展 Nebula 容器能力

如果 Nebula 容器提供的基础 H5 页面双向通信能力无法满足需求,您可以对 Nebula 进行扩展开发:

  • JSAPI:如果您要从 H5 页面发起 Native 功能调用(如显示一个 ActionSheet,或显示联系人对话框),那么您需要扩展 JSAPI。JSAPI 可以通过 handler 方法,让您很方便地增加 H5 页面的 Native 功能调用来实现特定功能。具体的自定义方法,请参见 自定义 JSAPI

  • Plugin:如果您需要在某个时机(如进入页面、收到请求等)做某些事情(如记录埋点、修改返回数据等),那么您需要开发一个插件 (Plugin)。在插件中订阅相应的事件后,就可以在 handler 中对事件所携带的数据进行加工处理。具体的自定义方法,请参见 自定义插件

加载离线包

传统的在线 H5 技术容易受到网络环境影响,从而影响 H5 页面的性能。为了最大程度摆脱网络对 H5 页面加载的影响,您可以将不同的业务封装打包成为一个离线包,通过发布平台下发到客户端,对客户端资源进行更新。更多信息,请参见 离线包简介使用离线包

H5 容器埋点

在 H5 页面加载时,Nebula 容器会自动监控加载性能,并捕获相关的行为数据和异常报错数据。更多信息,请参见 H5 容器埋点