自定義插件
如果您需要在某個(gè)時(shí)機(jī)完成某些事件,例如進(jìn)入頁(yè)面時(shí)記錄埋點(diǎn),那么您需要開(kāi)發(fā)一個(gè)插件 (Plugin)。插件訂閱相應(yīng)的事件后,就可以在 handler 中實(shí)現(xiàn)對(duì)事件所攜帶的數(shù)據(jù)進(jìn)行加工處理。
關(guān)于此任務(wù)
自定義插件的過(guò)程分為以下步驟:
本文將結(jié)合 H5 容器和離線包 Demo,自定義一個(gè)在 H5 頁(yè)面加載時(shí),修改頁(yè)面導(dǎo)航欄的插件。
操作步驟
新建 Plugin
新創(chuàng)建的 Plugin 類(lèi)一般格式的代碼示例如下:
#import <NebulaSDK/NBPluginBase.h>
@interface MPPlugin4TitleView : NBPluginBase
@end
@implementation MPPlugin4TitleView
- (void)pluginDidLoad
{
}
- (void)handleEvent:(PSDEvent *)event
{
[super handleEvent:event];
}
- (int)priority
{
return PSDPluginPriority_High +1;
}
需注意以下幾點(diǎn):
命名:為與容器默認(rèn)提供的 Plugin 命名保持一致,統(tǒng)一以
XXPlugin4
開(kāi)頭,其中XX
為自定義的前綴。基類(lèi):所有插件均繼承自
NBPluginBase
。實(shí)現(xiàn)基礎(chǔ)方法:在
.m
文件中,需重寫(xiě)以下三個(gè)方法:- (void)pluginDidLoad
:必選。監(jiān)聽(tīng)的 H5 事件,事件列表請(qǐng)查看頭文件NBDefines.h
。- (void)handleEvent
:必選。處理監(jiān)聽(tīng)的事件觸發(fā)后的邏輯。- (``**int**``)``priority
:必選。事件的優(yōu)先級(jí),設(shè)置為PSDPluginPriority_High`` +``1
。- (void)addJSApis
:可選。因?yàn)橐c H5 通信,可能需要注冊(cè) JSAPI。
監(jiān)聽(tīng)事件
在 - (void)pluginDidLoad
方法中注冊(cè)需要監(jiān)聽(tīng)的事件。
- (void)pluginDidLoad {
self.scope = kPSDScope_Scene; // 1
[self.target addEventListener:kNBEvent_Scene_NavigationItem_Left_Back_Create_After withListener:self useCapture:NO];
// -- 修改導(dǎo)航欄風(fēng)格
[self.target addEventListener:kH5Event_Scene_NavigationBar_ChangeColor withListener:self useCapture:NO];
[super pluginDidLoad];
}
addEventListener
方法用于監(jiān)聽(tīng)某個(gè)事件,各參數(shù)說(shuō)明如下:
名稱(chēng) | 含義 |
scope | 設(shè)置事件影響范圍。目前支持的范圍從小到大依次是 Scene、Session 和 Service。 |
event | 設(shè)置事件名稱(chēng),事件常量定義在 |
listener | 設(shè)置事件的處理者,即提供 |
capture | 設(shè)置是否使用捕捉的方式傳播事件,一般使用 |
設(shè)置插件優(yōu)先級(jí)
避免自定義插件被覆蓋,需要設(shè)置插件的高優(yōu)先級(jí)。
- (int)priority
{
return PSDPluginPriority_High +1;
}
處理監(jiān)聽(tīng)
最后,在 - handleEvent:
中處理監(jiān)聽(tīng)的事件觸發(fā)后的邏輯。
- (void)handleEvent:(NBNavigationTitleViewEvent *)event
{
[super handleEvent:event];
if ([kNBEvent_Scene_NavigationItem_Left_Back_Create_After isEqualToString:event.eventType]){
// 在默認(rèn)返回按鈕基礎(chǔ)上,修改樣式
NSArray *leftBarButtonItems = event.context.currentViewController.navigationItem.leftBarButtonItems;
if ([leftBarButtonItems count] == 1) {
if (leftBarButtonItems[0] && [leftBarButtonItems[0] isKindOfClass:[AUBarButtonItem class]]) {
// 在默認(rèn)返回按鈕基礎(chǔ)上,修改返回箭頭和文案顏色
AUBarButtonItem *backItem = leftBarButtonItems[0];
backItem.backButtonColor = [UIColor greenColor];
backItem.titleColor = [UIColor colorFromHexString:@"#00ff00"];
// 隱藏返回箭頭
// backItem.hideBackButtonImage = YES;
// 隱藏返回文案:文案設(shè)置為透明,保留返回按鈕點(diǎn)擊區(qū)域
// backItem.titleColor = [UIColor clearColor];
}
}
[event preventDefault];
[event stopPropagation];
}else if([kH5Event_Scene_NavigationBar_ChangeColor isEqualToString:event.eventType]) {
// 禁止容器默認(rèn)導(dǎo)航欄樣式
[event preventDefault];
[event stopPropagation];
}
}
添加 JSAPI
若在注冊(cè) Plugin 的過(guò)程中,需要自定義 JSAPI 與 H5 頁(yè)面進(jìn)行交互,可在 - (void)addJSApis
方法中,使用代碼注冊(cè)(參考 自定義 JSAPI > 代碼注冊(cè))的方式進(jìn)行處理。此方法為可選項(xiàng),若無(wú)需要可不實(shí)現(xiàn)。
- (void)addJSApis
{
[super addJSApis];
// 可以在這里添加 TitleView 相關(guān)的自定義 JSAPI
}
注冊(cè) Plugin
創(chuàng)建了 Plugin 類(lèi)后,需要在自定義的 Plist 文件(參見(jiàn) 自定義 JSAPI > 注冊(cè) JSAPI 說(shuō)明)中注冊(cè)此 Plugin。
注冊(cè)的 Plugin 是一個(gè)字典類(lèi)型,包含以下三項(xiàng)內(nèi)容:
名稱(chēng) | 含義 |
name | 創(chuàng)建的 Plugin 類(lèi)名 |
scope | Plugin 生效的范圍 |
events | 監(jiān)聽(tīng)的 event 名稱(chēng) |
使用 Plugin
在
pluginDidLoad
方法中添加斷點(diǎn),觀察觸發(fā)時(shí)機(jī)的堆棧調(diào)用順序是否正確。在
handleEvent
方法中添加斷點(diǎn),觀察監(jiān)聽(tīng)的事件能否正確觸發(fā)。觀察 H5 頁(yè)面自定義的導(dǎo)航欄樣式是否生效。