BBASMUtilitiesProtocol.h
19.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
//
// BBASMUtilitiesProtocol.h
// SWAN
//
// Created by baidu on 2018/10/29.
// Copyright © 2018 baidu. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <Pyramid/Pyramid.h>
NS_ASSUME_NONNULL_BEGIN
AliasService(BBASMUtilitiesProtocol, bba_MNPUtilities)
#define BBASMCheckStringParam(__varName__, __key__,__obj__) \
BBASMCheckTypeParam(__varName__, __key__, NSString, CHECK_STRING_INVALID, __obj__)
#define BBASMCheckComponentIdParam(__varName__, __key__,__obj__) \
BBASMCheckComponentId(__varName__, __key__, NSString, CHECK_STRING_INVALID, __obj__)
#define BBASMCheckDictionaryParam(__varName__, __key__, __obj__) \
BBASMCheckTypeParam(__varName__, __key__, NSDictionary, CHECK_DICTIONARY_INVALID, __obj__)
#define BBASMCheckTypeParam(__varName__, __key__, __type__, __check_function__, __obj__) \
__type__ *__varName__ = (__obj__)[__key__]; \
if (__check_function__(__varName__)) { \
[dispatcher doCallbackWithStatus:kBBASDCallBackParamsErrorStatus \
message:kBBASDCallBackParamsErrorMSG \
data:nil]; \
return; \
}
#define BBASMCheckComponentId(__varName__, __key__, __type__, __check_function__, __obj__) \
__type__ *__varName__ = (__obj__)[@"componentId"];\
if (__check_function__(__varName__)) {\
__varName__ = (__obj__)[__key__]; \
}\
if (__check_function__(__varName__)) { \
[dispatcher doCallbackWithStatus:kBBASDCallBackParamsErrorStatus \
message:kBBASDCallBackParamsErrorMSG \
data:nil]; \
return; \
}
#ifdef DEBUG
#define BBASMDebugLog(fmt, ...) NSLog((fmt), ##__VA_ARGS__)
#else
#define BBASMDebugLog(...)
#endif
extern NSString * const kBBASMPageFavoriteModelCommand;
extern NSString * const kBBASMPageFavoriteModelIcon;
extern NSString * const kBBASMPageFavoriteModelAppName;
extern NSString * const kBBASMPageFavoriteModelURL;
extern NSString * const BBASM_VIDEO_LAUNCH_MONITOR_UBC;
extern NSString * const BBASM_VIDEO_PRE_INIT;
extern NSString * const BBASM_VIDEO_PRE_INIT_END;
extern NSString * const BBASM_VIDEO_OPEN;
extern NSString * const BBASM_VIDEO_NA_START;
extern NSString * const BBASM_VIDEO_INIT;
extern NSString * const BBASM_VIDEO_INIT_END;
extern NSString * const BBASM_VIDEO_WILL_PLAY;
extern NSString * const BBASM_VIDEO_PREPARE_TO_PLAY;
extern NSString * const BBASM_VIDEO_READY_TO_PLAY;
extern NSString * const BBASM_VIDEO_PLAY_SUCCESS;
extern NSString * const BBASM_VIDEO_PLAY_FAIL;
extern NSString * const BBASM_VIDEO_PLAY_CANCEL;
extern NSString * const BBASMWorkBoxID;
extern NSString * const BBASMSmartWidgetCenterID;
static NSString *const BBASMStableLogTypeAuth = @"cs_auth";
static NSString *const BBASMStableLogTypeCommon = @"cs_common";
@protocol BBASMRenderBaseViewControllerProtocol;
@protocol BBASMRenderBaseControllerUIProtocol;
@protocol BBASMComponentManagerProtocol;
typedef NS_ENUM(NSInteger, BBASMHistoryLableType) {
BBASMHistoryLableTypeApp = 0,
BBASMHistoryLableTypeGame
};
#define BBASMSlaveWebViewProtocols BBASMRenderBaseViewControllerProtocol, BBASMRenderBaseControllerUIProtocol, BBASMComponentManagerProtocol
@class BBASchemeDispatcher;
@protocol BBASMUtilitiesProtocol <NSObject>
+ (UIViewController<BBASMSlaveWebViewProtocols> *)getSlaveWebVCById:(NSString *)slaveId
appId:(NSString *)appId;
+ (UIViewController<BBASMSlaveWebViewProtocols> *)getAnySlaveWebVCWithSlaveID:(NSString *)slaveID
appID:(NSString *)appID;
+ (UIViewController<BBASMSlaveWebViewProtocols> *)getSlaveWebVCByDispatcher:(BBASchemeDispatcher *)dispatcher;
///获取appid
+ (NSString *)currentAppID:(BBASchemeDispatcher *)dispatcher;
///获取name
+ (NSString *)currentAppName:(BBASchemeDispatcher *)dispatcher;
/// 获取当前的导航栈控制器
+ (UINavigationController *)getCurrentNavigationController;
//获取手百导航栈中在最上层的小程序的appKey
+ (NSString *)getTopBBASMAppKey;
/// 查找NavigationBar的shadowImageView
+ (nullable UIImageView *)findShadowImageViewForNavigationBar:(UIView *)view;
/// 获取Window上topVC的导航栈,如果是小程序,则是小程序所在的导航栈控制器,否则则是百度App的导航栈控制器
+ (UINavigationController *)getTopNavigationController;
///获取appKey
+ (nullable NSString *)currentAppKey:(BBASchemeDispatcher *)dispatcher;
///获取appKey
+ (nullable NSString *)appKeyByAppId:(NSString *)appId;
/**
* kv数据库存储能力。
* @param value 存储内容
* @param key 存储内容的键值
* @return 是否成功存储(非法value/key会return NO)
*/
+ (BOOL)saveValue:(NSData * _Nullable)value
forKey:(NSString *_Nullable)key;
/**
* kv数据库获取能力。
* @param key 存储内容的键值
* @return 存储内容(非法value会return nil)
*/
+ (NSData * _Nullable)getValueForKey:(NSString *_Nullable)key;
/**
* kv数据库删除能力。
* @param key 存储内容的键值
* @return 存储内容(非法value会return NO)
*/
+ (BOOL)removeValueForKey:(NSString *_Nullable)key;
/*!
* @brief 获取直播间监听对象
*
* @param appId 小程序id
* @param castId 直播间id
* @return 监听者
*/
+ (id)getMessageItemByAppId:(NSString *)appId castId:(NSString *)castId;
/*!
* @brief 添加直播间监听对象
*
* @param item 监听者
* @param appId 小程序id
* @param castId 直播间id
*/
+ (void)addMessageItem:(id)item
castId:(NSString *)castId
appId:(NSString *)appId;
/**
判断字符串是否数字类型
@param aString aString
@return YES 是数字
*/
+ (BOOL)isStringPureInt:(NSString *)aString;
/// 获取百度App的导航栈控制器
+ (UINavigationController *)getBDAppNavigationController;
/// 获取当前小程序所在的导航栈控制器
+ (UINavigationController *)getMNPNavigationController;
/// 获得导航栈中顶部的slaveWebVC或者gameVC
+ (UIViewController *)getNavigationTopViewController;
/// 获得导航栈中顶部的VC (包括slaveVC gameVC errorViewVC)
+ (UIViewController *)getUniversalTopViewControllerWithAppID:(NSString *)appId;
/*!
* @brief 判断当前的slaveid 对应的slaveViewController是否是首页
*
* @param slaveID slaveID
* @param appID appID
*
* @return YES 是首页
*/
+ (BOOL)isFirstSlaveViewController:(NSString *)slaveID
appid:(NSString *)appID;
///根据appID 获取调起场景值 appScene,互相调起时上一个来源小程序ID: pre_appId, 相互调起时上一个来源渠道码: pre_source 等信息
+ (NSDictionary *)appExtInfo:(NSString * _Nullable)appID;
///根据appID 获取appName
+ (NSString *)appName:(NSString *)appID;
/// 根据 url 获取小程序缓存图片数据
+ (UIImage *)findCachedImageWithURL:(NSString *)URL;
/**
* @brief 协议头,小程序/小游戏端能力协议头,比如手百:baiduboxapp
* !!!:schemeName与hostName可能不同
* @return NSString,协议头
*/
+ (NSString *)mnpScheme;
/**
* @brief 判断当前APP是否是百度APP
*
* @return 返回是否是百度APP
*/
+ (BOOL)isBaiduBoxApp;
/// @brief 是否使用百度开源联盟登录
+ (BOOL)isUseUnionAccountLogin;
/**
* @brief 增加打点数据给bbamnppyramid 使用
*
* @param actionID 打点的 id
* @param dict 打点的数据结构
* @param appID 传 nil 取最上层的 appid
*/
+ (void)addEventWithActionID:(NSString *)actionID object:(NSDictionary *)dict appID:(NSString * _Nullable) appID;
/// 打点的公参
+ (NSMutableDictionary *)appStatisticsExtInfo:(NSString * _Nullable)appID;
/// ubc打点 小程序添加参数
+ (NSDictionary *)ubcStatisticsExtInfo:(NSString *)appID;
/**
* @brief 获取当前页面信息,包括appKey,scheme 用于单页收藏和单页入历史
*
* @param from 打开的场景值(搜索,阅读)
* @param appKey 当前页面所在的 appID
* @return 单页收藏和入阅读历史所需 model 信息
*/
+ (NSDictionary *_Nullable)pageInfoModelWithScene:(NSString *)from appKey:(NSString * _Nullable)appKey URLPath:(NSString *_Nullable)URLPath;
/**
* @brief 将一个网络urlstring转为url,其中做了一些编码和fix操作
* 原来使用的urlfixer已经废弃,不建议调用,统一使用这个方法
*
* @param URLString urlString
* @return url
*/
+ (NSURL *)URLWithURLString:(NSString *)URLString;
/**
* @brief 获取宿主app的版本号,通过CFBundleVersion获取
* @return 返回xxx.xxx.xxx.xxx格式的版本号
*/
+ (NSString *)hostVersion;
/**
* @brief 获取宿主app的名字
* @return 宿主app的名字
*/
+ (NSString *)hostName;
/**
* @brief 检查APPID对应的小程序是否是活动状态
*
* @param appID 小程序ID
* @return 是否是活动状态
*/
+ (BOOL) checkCurrentAppActiveStatus:(NSString *)appID;
// 公参接口
+ (NSString *)composeParameters;
// 服务端接口
+ (NSString *)rootServerHost;
/**
* @brief 获取当前APP的的包名CFBundleIdentifier
*
* @return 返回包名
*/
+ (NSString *)packageName;
/**
* @brief 获取当前小程序的的tmp路径
*
* @return 返回tmp路径
*/
+ (NSString *)curAppTmpPath;
/**
* @brief 获取历史中所有小程序的appid数组
*
* @return 历史中所有小程序的appid数组
*/
+ (NSArray *)fetchAllHistoryAppIds;
/**
* @brief block在主线程异步执行
*/
+ (void)excuteMainThreadBlock:(dispatch_block_t)block;
/**
* @brief block在主线程同步执行
*/
+ (void)excuteSyncMainThreadBlock:(dispatch_block_t)block;
/**
* @brief 打开预取时,是否可以显示popup UI(匹配appID)
*/
+ (BOOL)shouldPopupInPrefetchPolicyWithID:(NSString *)appID;
/**
* @brief 设置小程序TTS的播放状态
*
* @param ttsStatus TTS播放状态
* @param appID appID
*/
+ (void)setSmartWidgetTTSStatus:(BOOL)ttsStatus withAppID:(NSString *)appID;
/**
* @brief 个性化地图json所在目录
*/
+ (NSString *)rootForCustomMapStylePath;
/**
* @brief 获取xcx相关ab实验开关
*
* @return xcx相关ab实验开关
*/
+ (NSDictionary *)abTestSwitches;
/**
* @brief 根据appId获取BBASMApp中导航栈栈顶的slaveWebVC, 默认包含 通过 ShowModalPage 添加的 SlaveVC
*
* @param appId 小程序ID
* @return 小程序导航栈顶的slaveVC
*/
+ (UIViewController<BBASMRenderBaseViewControllerProtocol> *)getTopSlaveWebViewControllerByAppId:(NSString *)appId;
/**
* @brief 根据appId获取BBASMApp中导航栈栈顶的slaveWebVC
*
* @param appId 小程序ID
* @param includeSpecialSlaveVC 是否包含特殊的 slaveVC (例如是否包含全屏弹窗slaveVC)
* @return 小程序导航栈顶的slaveVC
*/
+ (UIViewController<BBASMRenderBaseViewControllerProtocol> *)getTopSlaveWebViewControllerByAppId:(NSString *)appId
includeSpecialSlaveVC:(BOOL)includeSpecialSlaveVC;
/**
* @brief 从字典生成json字符串
*
* @param dictionary dict
* @return jsonString
*/
+ (NSString *)jsonStringFromDictionary:(NSDictionary *)dictionary;
/*
* @brief 获取extensionJS版本号
* @param appId 小程序appId
* @return 返回版本号
*/
+ (nullable NSString *)extensionJSVersion:(NSString *)appId;
/**
* @brief 获取coreJs版本号
*
* @param appId appId
* @return 返回版本号
*/
+ (nullable NSString *)coreJsVersion:(NSString *)appId;
/*
* @brief 获取小程序加载协议页面
*
* @param title 页面标题
* @param url 页面url
*/
+ (UIViewController *)getMNPSimpleWebVCWithTitle:(NSString *)title url:(NSString *)url;
/**
* @brief master指针地址,logfile小程序标识
*
* @return 取master指针地址
*/
+ (NSString *)masterAddressWithAppId:(NSString *)appID;
/// 设置状态栏夜间模式
+ (void)setStatusbarDarkContent;
/// 设置VC夜间模式
+ (void)setViewControllerLightMode:(UIViewController *)viewController;
/// 获取小程序包的metaInfo信息
/// @param appID appID
+ (id)getPackageMetaInfo:(NSString *)appID;
/**
* @brief 根据协议名字创建类
* @param protocol 协议名字
* @return 根据协议名字创建的类
*/
+ (Class)adapterServiceProtocol:(Protocol *)protocol;
/**
* @brief 添加视频时长打点(1641)
*
* @param actionID 流式打点id
* @param appID appID
*/
+ (void)addVideoEventWithActionID:(NSString *)actionID appID:(NSString *)appID;
/**
* @brief 添加视频时长打点参数
*
* @param errCode 错误码
* @param errMsg 错误信息
* @param appID appID
*/
+ (void)addVideoEventErrCode:(NSString *)errCode errMsg:(NSString *)errMsg appID:(NSString *)appID;
/**
* @brief appID 小程序appID
*
* @return 顶层slave页面的pageUrl
*/
+ (NSString *)getTopSlavePagePathWithAppID:(NSString *)appID;
/// 当前设备是否是横屏
+ (BOOL)isDeviceLandscape;
/**
* @brief 统计前端打点信息
* @param appId appId
* @param data 通过ubcStatisticEvent传递的数据
*/
+ (void)updateStatistic:(NSString *)appId withData:(NSDictionary *)data;
/// 打开权限设置页面
/// @param appID 小*程*序ID
+ (void)openAuthSettingPage:(NSString *)appID;
/// 菜单点击事件打点
/// @param value 添加value日志
/// @param extDic 添加ext字段下的extDic
+ (void)pannelItemClickLogWithValue:(NSString *)value
extDic:(nullable NSDictionary *)extDic;
/// 菜单show事件打点
/// @param value 添加value日志
/// @param contentExtDic 打点的content字段中添加扩展字段和值
/// @param extDic 添加ext字段下的extDic
+ (void)pannelItemShowLogWithValue:(NSString *)value
contentExtDic:(nullable NSDictionary *)contentExtDic
extDic:(nullable NSDictionary *)extDic;
/**
* @brief 自定义浏览量数据统计
* @param statisticsParams 用于自定义统计的参数
* @param isRecordTrace 是否记录到 tracelog
*/
+ (void)customPVStatistics:(NSDictionary *)statisticsParams
isRecordTrace:(BOOL)isRecordTrace;
/// @brief 自定义统计打点
/// @param eventId 统计点号
/// @param statisticsParams 统计数据
+ (void)customPVStatisticsID:(NSString *)eventId
statisticsParams:(NSDictionary *)statisticsParams;
/// @brief 当前xcx是否添加cookie
/// @param appId xcx标识
/// @return 返回当前xcx是否应该添加cookie
+ (BOOL)shouldUseCookieStorageWithAppId:(NSString *)appId;
/// @brief 获取当前xcxurl下的cookie信息
/// @param url 链接url
/// @param appId xcx标识
/// @return 返回cookie
+ (NSString *)cookieForUrl:(NSString *)url withAppId:(NSString *)appId;
/// 磁盘等级发生变化通知,当磁盘状态为相对不足或严重不足时,会触发进入后台强制清理包缓存逻辑
/// level 0 正常, 1 相对不足, 2 严重不足;
/// @param diskUsageLevel 磁盘状态变化后的level, 磁盘等级会影响包缓存清理策略;
+ (void)diskUsageLevelDidChanged:(NSInteger)diskUsageLevel;
/**
* @brief 获取指定小程序的appInfo
*
* @param appID 小程序appID
*/
+ (nullable NSDictionary *)getAppInfo:(NSString *)appID;
/// 获取当前的key window
+ (UIWindow *)applicationWindow;
/// 获取paginfo xcx 的小程序名称、小程序logo,页面title、页面描述、页面路径
/// paramDic = {"appName" : "tieba","iconUrl" : "http://xxxx",appDesc:"xcx",title:"title",pageUrl:"pageUrl"}
/// @param complete 结果回调
+ (void)getPageInfoWithComplete:(void(^)(NSDictionary *paramDic))complete;
/// 获取最上面的vc 上面的renderview
/// @param appID appID
+ (UIView *)getTopSlaveRenderViewByAppID:(NSString *)appID;
/**
* @brief 统计sla稳定性数据
* @param requestUrl 接口
* @param isPVLog 是否是调起总量PV(分母)
* @param response 接口返回值
* @param reponseStausCode code值
* @param error 接口错误
* @param appId appId
* @param type 接口对应打点日志中的type
*/
+ (void)recordStableLogWithRequestUrl:(nullable NSString *)requestUrl
isPVLog:(BOOL)isPVLog
response:(nullable NSDictionary *)response
reponseStausCode:(NSInteger)reponseStausCode
error:(nullable NSError *)error
appId:(nullable NSString *)appId
type:(nullable NSString *)type;
/// @brief 根据 appID 获取当前内存中小程序的 launchid(调起时生成的唯一标识)
/// @param appID appID
/// @return launchID 调起时生成的唯一标识
+ (nullable NSString *)launchIDWithAppID:(NSString *)appID;
/// @brief 根据 appID 获取当前内存中小程序的 launchid(调起时生成的唯一标识),并作为url参数拼接到srcUrl中,用于日志串联
/// @param appID appID
/// @return srcUrl 请求的 url
+ (NSString *)appendUrlParamLaunchIDWithAppID:(NSString *)appID forSrcUrl:(NSString *)srcUrl;
/**
* Get int value from a version string. Only support 3-digit(or less than 3-digit) of every version.
*
* @example "1.21.3" -> 1021003
* "0.2.4" -> 2004
*
* @param version A string of version.
* @return A NSNumber value that represent the version.
*/
+ (NSNumber *)getIntValueOfVerion:(NSString *)version;
/**
* @brief cloudUrl批量转HttpUrl
*
* @param cloudUrls cloudUrl数组
* @param appID appID
* @param complete 转换成功后回调HttpUrl数组(顺序不变)
*/
+ (void)cloudUrlsToHttpUrls:(NSArray *)cloudUrls
appID:(NSString *)appID
complete:(void (^)(NSArray * _Nullable httpUrls))complete;
/**
* @brief 当前页面是否被收藏
*
* @param appID appID
* @return 是否被收藏
*/
+ (BOOL)isCurrentPageFavoredWithAppID:(NSString *)appID;
/// @brief 获取 appID 对应 xcx 最近一次 onPrefetch 事件的 pageUrl
/// @param appID appID
/// @return refetch event referer PageUrl
+ (nullable NSString *)getOnPrefetchPageUrlWithAppID:(NSString *)appID;
/// @brief 更新appID 对应 xcx 的onPrefetch 事件的 pageUrl
/// @param pageUrl 事件的 pageUrl (可为nil,若为 nil 则是清空该字段)
/// @param appID appID
+ (void)updateOnPrefetchPageUrl:(nullable NSString *)pageUrl withAppID:(NSString *)appID;
/// 增加小程序级别的管理对象
/// @param appID 小程序ID
/// @param managerObj 管理对象
+ (void)bindManagerToAppExtension:(NSObject *)managerObj withAppID:(NSString *)appID;
/// 查找绑定在该小程序上的管理对象
/// @param className 管理对象类型
/// @param appID 小程序ID
/// @return 查找到的绑定在该小*程*序上的管理对象,没查到时返回nil
+ (nullable NSObject *)findManagerFromAppExtension:(NSString *)className withAppID:(NSString *)appID;
/// @brief 向master派发eventName事件
/// @param appID 小程序ID
/// @param eventName NSString,事件名为以上声明kSwanEventXXX
/// @param eventParam NSDictionary,派发事件传递的参数
/// @param completionHandler block,js执行完成
+ (void)dispatchToMasterAppID:(NSString *)appID
eventName:(NSString *)eventName
eventParam:(NSDictionary * _Nullable)eventParam
completionHandler:(void (^ _Nullable)(_Nullable id result, NSError * _Nullable error))completionHandler;
/// 获取宿主当前隐私授权的状态 0:用户尚未作出选择 1:用户已授权隐私协议 2:仅浏览模式
+ (NSString *)getCurrentPrivacyMode;
/// ubc和ceres双打函数
/// @param appID appid
/// @param ceresID ceresID
/// @param ubcID ubcID
/// @param params 打点参数
+ (void)addEventToCeresAndUBCWithAppID:(NSString *)appID
ceresID:(NSString *)ceresID
ubcID:(NSString *)ubcID
params:(NSDictionary *)params;
@end
NS_ASSUME_NONNULL_END