BBAUpdateCoreDispatcher.h 4.12 KB
//
//  BBAUpdateCoreDispatcher.h
//  BBAComs-BBAUpdate
//
//  Created by 樊帅飞 on 2017/11/1.
//

#import <Foundation/Foundation.h>
#import "BBAUpdateConstants.h"

@protocol BBAUpdateInterfaceClassProtocol;
@protocol BBAUpdateInterfaceClassProviderProtocol;

/**
 updatek核心分发器;
 负责收集上行参收集及下行参数分发;
 */
@interface BBAUpdateCoreDispatcher : NSObject

+ (instancetype)shareInstance;



/**
 注册接入方,建议放在Pyramid moduleRegister:中注册;

 @param interfaceClass 接入方实现BBAUpdateInterfaceClassProtocol的类
 @return 是否注册成功;
 */
+ (BOOL)registerInterfaceClass:(Class<BBAUpdateInterfaceClassProtocol>)interfaceClass;

/**
 设置接入方批量提供者类,建议放在Pyramid moduleRegister:中注册;

 @param provider 遵循BBAUpdateInterfaceClassProviderProtocol的类,该协议的实现者可以实现方法返回多个接入方;
 @return 是否注册成功;
 */
+ (BOOL)registerInterfaceClassesProvider:(Class<BBAUpdateInterfaceClassProviderProtocol>)provider;


/**
 获取update接口参数
 
 返回数据格式为 @[@{bbaUpdateIdentifierKey:@"feed/feed_tab",
                 bbaUpdateVersionKey: @"0",
                 bbaUpdateDataKey :@{$customData}
                 },
               @{bbaUpdateIdentifierKey:@"video/video_case",
                 bbaUpdateVersionKey: @"0",
                 bbaUpdateDataKey :@{$customData}
                }];
  @see bbaUpdateIdentifierKey 必传,对应值为节点id;
  @see bbaUpdateVersionKey 必传,值为节点在本地的最新版本号,默认为“0”,之后取上次update接口返回的该节点数据中的版本号;
  @see bbaUpdateDataKey 非必填,拓展数据字段,update只透传对应数据,对呀值为字典类型;

 @return post data
 */
- (NSArray *)updateRequestPostHeaderData;


/**
 获取update接口参数
 
 @param filterBlock 节点过滤回调,会遍历每个节点多次调用该block,如果block返回YES表示当前节点需要丢弃;如果该block为nil或返回值为NO,这表示当前节点不需要丢弃。
 @return update接口参数
 */
- (NSArray *)updateRequestPostHeaderDataWithFilter:(BOOL(^)(NSString *identifier))filterBlock;

/**
 * @brief 分发update数据 http://wiki.baidu.com/pages/viewpage.action?pageId=496896221
 *
 *
 * @param data update数据
 * @param optionsDict 服务配置数据(serviceConfig)处理选项
                  1.如果serviceConfigOptions不能够解析到 version_asc == 1 (例如serviceConfigOptions为空,不是字典等),则serviceConfig配置无需做多余处理,可以直接使用,存储等(如果服务或者业务认为数据格式正确);
                   2.如果能够解析到 version_asc == 1,则对于serviceConfig的node节点的版本号"v"需要与上次分发的相同node的版本号"v"做比较,如果版本号大于上次下发的node的版本号,则node节点生效,否则按照废弃处理
 
                   目前格式定义如下
                       "options": {//
                           "version_asc": "1"// 服务配置节点版本号控制比较 version_asc == 1,版本号需要做递增比较,参考上面 2 解释,否则无需比较,参考 1 解释
                         }
 * @param ubcExtInfoBlock nil ubc统计数据回调;
              ubcExtInfo中含有 :  timestamp (配置文件接收时间戳(毫秒))
                                 detail (格式为jsonarray 里面的jsonobject定义如下: product:业务名 string version:配置版本 string valid:是否有效 int(1为有效,0为无效) 示例: [ {"product":"search", "version":"201802271744", "valid" : 1 }, {"product":"flash", "version": "201802271744", "valid": 0} ])
                                 totalCount 总节点个数
                                 successCount 成功分发节点的个数
                                 versionFilterCount 因版本号问题被过滤掉节点的个数
 */
- (void)distributionUpdateData:(NSDictionary *)data
                       options:(NSDictionary *)optionsDict
                    ubcExtInfo:(void(^)(NSDictionary *ubcExtInfo))ubcExtInfoBlock;

@end