BBASMDispatchEvent.h 10.5 KB
//
//  BBASMDispatchEvent.h
//  SWAN
//
//  Created by baidu on 2018/11/6.
//  Copyright © 2018 baidu. All rights reserved.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

#pragma mark - 声明小程序内部事件

/**
 * @brief 向master派发AppReady事件;
 *
 * @ param NSDictionary,{@"appConfig":(NSString),
 *                       @"appPath":(NSString),
 *                       @"extraData":(NSDictionary,可以为空),
 *                       @"pageUrl":(NSString,可以为空),
 *                       @"wvID":(NSNumber,NSInteger),
 *                       @"root":(NSString,可以为空),
 *                       @"devhook":(NSString,值为@"true"或@"false"),
 *                      }
 */
extern NSString * const kBBASMEventAppReady;

/**
 * @brief 小程序lifecycle事件,向master派发lcType:onAppShow;
 *
 * @ param NSDictionary,{@"appId":(NSString,可以为空),
 *                       @"cuid":(NSString,可以为空),
 *                       @"mtjCuid":(NSString,可以为空),
 *                       @"clkid":(NSString,可以为空),
 *                       @"scene":(NSString,可以为空),
 *                       @"extraData":(NSDictionary,可以为空),
 *                      }
 */
extern NSString * const kBBASMEventOnAppShow;

/**
 * @brief 小程序lifecycle事件,向master派发lcType:onAppHide;
 *
 * @ param NSDictionary,{@"appId":(NSString,可以为空)}
 */
extern NSString * const kBBASMEventOnAppHide;

/**
 * @brief 小程序lifecycle事件,向master派发lcType:onClose;
 *
 * @ param NSDictionary,{@"appId":(NSString,可以为空)}
 */
extern NSString * const kBBASMEventOnClose;

/**
 * @brief 小程序lifecycle事件,向master派发lcType:onShow;
 *
 * @ param NSDictionary,{@"wvID":(NSString,页面id)}
 */
extern NSString * const kBBASMEventOnShow;

/**
 * @brief 向slave派发PageReady事件;
 *
 * @ param NSDictionary,{@"pagePath":(NSString,可以为空),
 *                       @"appPath":(NSString,可以为空),
 *                       @"onReachBottomDistance":(NSString,可以为空),
 *                       @"devhook":(NSString,@"true"或@"false"),
 *                       @"root":(NSString,可以为空),
 *                      }
 */
extern NSString * const kBBASMEventPageReady;

/**
 * @brief 小程序lifecycle事件,向master派发lcType:onHide;
 *
 * @ param NSDictionary,{@"wvID":(NSString,页面id)}
 */
extern NSString * const kBBASMEventOnHide;

/**
 * @brief 小程序lifecycle事件,向master派发lcType:onUnload;
 *
 * @ param NSDictionary,{@"wvID":(NSString,页面id)}
 */
extern NSString * const kBBASMEventOnUnload;

/**
 * @brief 向master、slave派发message事件;
 *
 * @ param NSDictionary,{@"message":(NSString,message)}
 */
extern NSString * const kBBASMEventMessage;

/**
 * @brief 向master派发updateStatusChange事件;
 *
 * @ param NSDictionary,{@"eventType":(NSString,可以为空),
 *                       @"data":(NSString,可选,可以为空),
 *                      }
 */
extern NSString * const kBBASMEventUpdateStatusChange;

/**
 * @brief 向master派发backtohome事件;
 *
 * @ param NSDictionary,{@"url":(NSString,可以为空),
 *                       @"from":(NSString,可选,来源:menu),
 *                      }
 */
extern NSString * const kBBASMEventBackToHome;

/**
 * @brief 向master派发onForceRelaunch事件;
 *
 * @ param NSDictionary,{@"homePath":(NSString,首页路径),
 *                       @"pagePath":(NSString,当前页面路径),
                         @“slaveId” :(NSString,当前页面的slaveId)
 *                      }
 */
extern NSString * const kBBASMEventOnForceRelaunch;

/**
 * @brief 向master派发onTabItemTap事件;
 *
 * @ param NSDictionary,{@"index":(NSString,可以为空),
 *                       @"wvID":(NSString),
 *                       @"pagePath":(NSString),
 *                       @"text":(NSString),
 *                      }
 */
extern NSString * const kBBASMEventOnTabItemTap;

/**
 * @brief 向master派发onUserCaptureScreen事件(用户截屏);
 */
extern NSString * const kBBASMEventOnUserCaptureScreen;

/**
 * @brief 向slave派发PullDownRefresh事件(下拉刷新);
 */
extern NSString * const kBBASMEventPullDownRefresh;

/**
 * @brief 向master派发sharebtn事件(分享);
 *
 * @ param NSDictionary,{@"wvID":(NSString),
 *                       @"webViewUrl":(NSString,可以为空),
 *                       @"text":(NSString),
 *                      }
 */
extern NSString * const kBBASMEventShareBtn;

/**
 * @brief 向master派发route事件;
 *
 * @ param NSDictionary,{@"fromId":(NSString,可以为空),
 *                       @"toId":(NSString,可以为空),
 *                       @"routeType":(NSString,可以为空),
 *                       @"toPage":(NSString,@"true"或@"false"),
 *                       @"toTabIndex":(NSString,可以为空),
 *                      }
 */
extern NSString * const kBBASMEventRoute;

/**
 * @brief 向master和slave发送CollectTraceError事件,通知master和slaved向端上发送LaunchTrace和前端报错
 */
extern NSString * const kBBASMEventCollectTraceError;

/**
 * @brief 向master派发预取事件,默认为preload,可配置支持预取时发prefetch;
 *
 * @ param NSDictionary,{@"state":(NSString),
 *                       @"appPath":(NSString),
 *                       @"appKey":(NSString),
 *                       @"schema":(NSString),
 *                       @"scene":(NSString,可以为空)
 *                      }
 */
extern NSString * const kBBASMEventPreload;

/**
 * @brief 向master派发预取事件,默认为preload,可配置支持预取时发prefetch;
 *
 * @ param NSDictionary,{@"state":(NSString),
 *                       @"appPath":(NSString),
 *                       @"appKey":(NSString),
 *                       @"schema":(NSString),
 *                       @"scene":(NSString,可以为空)
 *                      }
 */
extern NSString * const kBBASMEventPrefetch;

/**
 * @brief 向master派发favorStatusChange事件(关注状态发生改变时派发)
 *
 * @ param NSDictionary,{@"status":(NSString)}
*/
extern NSString * const kBBASMEventfavorStatusChange;

/**
 * @brief 向master派发字体大小改变事件(用户设置或者新页面打开)
 *
 * @ param NSNumber,{@"level":(NSNumber)}
*/
extern NSString * const kBBASMEventFontSizeChange;

// 向master发送slaveReady事件,通知master某个slave页面已经ready了
extern NSString * const BBASMEventSlaveReady;

// SlaveDisposed事件,通知master某个slave页面已经销毁了
extern NSString * const BBASMEventSlaveDisposed;

// SlaveReady事件参数:slaveID
extern NSString * const BBASMEventParamSlaveID;

/// 二级 slave 预加载 topPages 资源事件
extern NSString *const BBASMSlaveEventTopPages;

/**
 * @brief 向master派发FMP渲染完成事件
 *
 * @ param NSDictionary,{@"pageRoutePath":(NSString),
 *                       @"wvID":(NSString)
 *                      }
*/
extern NSString * const kBBASMEventFirstMeaningfulPainted;

// 将记录的稳定性数据传递给前端
extern NSString * const BBASMEventSendStabilityData;

/**
 * @brief 向master派发点击胶囊关闭按钮事件;
 *
 * @ param NSDictionary,{@"wvID":(NSString)}
 */
extern NSString *const BBASMEventCloseBtn;

// 通知前端稳定性测试开关状态事件
extern NSString * const BBASMEventToggleStabilityTestStatus;

#pragma mark- 延迟派发的事件Key值

/**
 * @brief 定义setTabBarStyle端能力的延迟调用的标识;
 * 当调用setTabBarStyle端能力时,若tababrCVC还未加到小程序导航栈,该端能力调用失效,则延迟该端能力调用时机;
 * 当tababrCVC入栈完成后则调用此键值对应的事件;
 */
extern NSString * const kBBASMPluginTabBarSetTabBarStyle;

/// PageReady事件中插件路径的关键字
extern NSString * const kBBASMPluginPath;

#pragma mark - Event参数key
extern NSString * const kBBASMEventParamKeyPageURL;
extern NSString * const kBBASMEventParamKeyPageRoutePath;
extern NSString * const kBBASMEventParamKeyWebviewID;
extern NSString * const kBBASMEventParamKeyNAUpScreenTime;

#pragma mark - 分发事件接口

@protocol BBASMEventInterface <NSObject>

@optional

/**
 * @brief 向master或slave派发指定事件;
 *
 * @param jsCode NSString,js代码
 * @param completionHandler block,js执行完成
 */
- (void)dispatchEventJS:(NSString *)jsCode
      completionHandler:(void (^ _Nullable)(_Nullable id result,
                                            NSError * _Nullable error))completionHandler;

/**
 * @brief 向master或slave派发eventName事件;
 *
 * @param eventName NSString,事件名为以上声明kSwanEventXXX
 * @param eventParam NSDictionary,派发事件传递的参数
 * @param completionHandler block,js执行完成
 */
- (void)dispatchEventName:(NSString *)eventName
               eventParam:(NSDictionary * _Nullable)eventParam
        completionHandler:(void (^ _Nullable)(_Nullable id result,
                                              NSError * _Nullable error))completionHandler;

/**
 * @brief 向master派发相关小程序声明周期的事件;
 *
 * @param lifeCycleName NSString,事件名为:AppReady、onAppShow、onAppHide、onClose、onShow、onHide、OnUnload
 * @param eventParam NSDictionary,派发事件传递的参数
 * @param completionHandler block,js执行完成
 */
- (void)dispatchLifeCycleName:(NSString *)lifeCycleName
                   eventParam:(NSDictionary * _Nullable)eventParam
            completionHandler:(void (^ _Nullable)(_Nullable id result,
                                                  NSError * _Nullable error))completionHandler;

@end

#pragma mark - 扩展NSObject实现BBASMEventInterface接口

@interface NSObject (BBASMDispatchEvent) <BBASMEventInterface>


@end

#pragma mark - BBASMDispatchEvent

/**
 * @brief 延迟执行的事件block类型;
 *
 */
typedef void(^EventBlock)(void);

@interface BBASMDispatchEvent : NSObject

/**
* @brief 存储延迟执行的事件;key:类名+方法名  value:要执行的代码块
*
*/
@property(nonatomic,strong)NSMutableDictionary *eventPools;

+ (instancetype)shareInstance;

/**
 * @brief 向pool增加回调事件;
 *
 * @param eName NSString,类名_方法名 作为block的key
 * @param block block,延迟执行的block
 */
- (void)addEventName:(NSString *)eName actionBlock:(EventBlock)block;

/**
 * @brief 触发事件;
 *
 * @param eName NSString,类名_方法名 作为block的key
 */
- (void)excuteEventName:(NSString *)eName;

@end

NS_ASSUME_NONNULL_END