全部产品
云市场
云游戏

自定义插件

更新时间:2020-08-07 16:07:26

如果您需要在某个时机完成某些事件,例如进入页面时记录埋点,那么您需要开发一个插件 (Plugin)。插件订阅相应的事件后,就可以在 handler 中实现对事件所携带的数据进行加工处理。

关于此任务

自定义插件的过程分为以下步骤:

  1. 新建 Plugin
  2. 注册 Plugin
  3. 使用 Plugin

查看 代码示例,自定义一个在 H5 页面加载时,修改页面导航栏的插件。

操作步骤

新建 Plugin

新创建的 Plugin 类一般格式如下,需注意以下几点:

  • 命名:为与容器默认提供的 Plugin 命名保持一致,统一以 XXPlugin4 开头,其中 XX 为自定义的前缀;
  • 基类:所有插件均继承自 NBPluginBase
  • 实现基础方法:在 .m文件中,需重写以下三个方法:
    • - (void)pluginDidLoad:必选。监听的 H5 事件,事件列表请查看头文件 NBDefines.h
    • - (void)addJSApis:可选。因为要与 H5 通信,可能需要注册 JSAPI。
    • - (void)handleEvent:必选。处理监听的事件触发后的逻辑。

.h 文件如下:

.m 文件如下:

监听事件

- (void)pluginDidLoad 方法中注册需要监听的事件。

  1. - (void)pluginDidLoad {
  2. self.scope = kPSDScope_Scene; // 1
  3. [self.target
  4. addEventListener:kNBEvent_Scene_TitleView_Title_Click // 2
  5. withListener:self // 3
  6. useCapture:NO]; // 4
  7. [super pluginDidLoad];
  8. }

addEventListener 方法用于监听某个事件,各参数说明如下:

名称 含义
scope 设置事件影响范围。目前支持的范围从小到大依次是 Scene、Session 和 Service。
event 设置事件名称,事件常量定义在 NBDefines.h 中。
listener 设置事件的处理者,即提供 - handleEvent: 的对象。
capture 设置是否使用捕捉的方式传播事件,一般使用 NO

添加 JSAPI

若在注册 Plugin 的过程中,需要自定义 JSAPI 与 H5 页面进行交互,可在 - (void)addJSApis 方法中,使用代码注册(参考 自定义 JSAPI > 代码注册)的方式进行处理。此方法为可选项,若无需要可不实现。

  1. - (void)addJSApis
  2. {
  3. [super addJSApis];
  4. // 可以在这里添加 TitleView 相关的自定义 JSAPI
  5. }

处理监听

最后,在 - handleEvent: 中处理监听的事件触发后的逻辑。

  1. - (void)handleEvent:(NBNavigationTitleViewEvent *)event
  2. {
  3. [super handleEvent:event];
  4. if([kNBEvent_Scene_TitleView_Create_Before isEqualToString:event.eventType]) {
  5. // 自定义创建 TitleView,将失去默认 kNBEvent_Scene_TitleView_[Title_Set | Title_Click | Subtitle_Click] 等事件支持
  6. NBNavigationTitleViewEvent *e = (NBNavigationTitleViewEvent *)event;
  7. H5WebViewController *currentViewController = (H5WebViewController *)event.context.currentViewController;
  8. UINavigationController *navi = currentViewController.navigationController ?:(UINavigationController *)APPDELEGATE.window.rootViewController;
  9. UINavigationBar *bar = navi.navigationBar;
  10. H5NavigationTitleView *newTitleView = [self createNavigationTitleView:bar.bounds];
  11. [newTitleView setMainTitle:@"重新创建" subtitle:nil];
  12. newTitleView.delegate = [e.titleView delegate];
  13. currentViewController.navigationItem.titleView = newTitleView;
  14. e.titleView = newTitleView;
  15. [e preventDefault];
  16. }
  17. }
说明:由于所有在 - (void)pluginDidLoad 方法中监听过的事件,触发时的处理都会集中到 - handleEvent: 方法中,所以如果监听了多个方法,需根据 eventclasseventType 对不同事件做不同处理。

注册 Plugin

创建了 Plugin 类后,需要在自定义的 Plist 文件(参见 自定义 JSAPI > 注册 JSAPI 说明)中注册此 Plugin。

aaa

注册的 Plugin 是一个字典类型,包含以下 3 项内容:

名称 含义
name 创建的 Plugin 类名
scope Plugin 生效的范围
events 监听的 event 名称

使用 Plugin

  • pluginDidLoad 方法中添加断点,观察触发时机的堆栈调用顺序是否正确。

    aaa

  • handleEvent 方法中添加断点,观察监听的事件能否正确触发。

    aaa

  • 观察 H5 页面自定义的导航栏样式是否生效。

    H5