BBASMAPPInfoModel.h 7.14 KB
//
//  BBASMAPPInfoModel.h
//  SWAN
//
//  Created by baidu on 2018/7/23.
//  Copyright © 2018年 baidu. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@class BBASMRemoteDebuggerParams;
@class BBASMLocalDebuggerParams;
@class BBASchemeDispatcher;

NS_ASSUME_NONNULL_BEGIN
/// 小程序类型字符串BBASM_UNCONFUSED_STR_METHOD(@"c3dhbg==") //swan
#define BBASMC_AppTypeString BBASM_UNCONFUSED_STR_METHOD(@"c3dhbg==") //swan
/// 小游戏类型字符串BBASM_UNCONFUSED_STR_METHOD(@"c3dhbmdhbWU=") //swangame
#define BBASMC_GameTypeString BBASM_UNCONFUSED_STR_METHOD(@"c3dhbmdhbWU=") //swangame
/// 其他类型字符串@"unknown"
extern NSString * const kBBASMUnknownTypeString;
/// 小程序打点字段: 上一个小程序ID
extern NSString * const kBBASMStatisticsPreAppID;
/// 小程序打点字段: 当前小程序最初调起渠道来源
extern NSString * const kBBASMStatisticsPreSource;
/// 当前小程序的调起的来源小程序appkey
extern NSString *const BBASMAppInfoSrcAppKey;
/// 当前小程序的调起的来源小程序pkgType
extern NSString *const BBASMAppInfoSrcPkgType;

/// 根据scheme会默认初始化一个类型
typedef NS_ENUM(NSUInteger, BBASMAPPInfoType) {
    BBASMAPPInfoTypeSMWorkBox, // 小程序
    BBASMAPPInfoTypeGame,     // 小游戏
    BBASMAPPInfoTypeUnknown,  // 未知
    BBASMAPPInfoTypeWebGame,  // wasm等直接通过webview加载的gm类型
};

typedef NS_ENUM(NSUInteger, BBASMShowByType) {
    BBASMShowByTypeSys,      // 除了用户和协议之外,目前 Android 在使用
    BBASMShowByTypeUser,     // 用户后台调起
    BBASMShowByTypeSchema,   // 由协议调起
};

// Debug小程序的AppID
UIKIT_EXTERN NSString * const DebugAppID;

@interface BBASMAPPInfoModel : NSObject

/// 小程序id,对应bundleid,业务请求(除pms)应该使用appkey
@property (nonatomic, copy, readonly) NSString *appID;
/// 打开小程序来源小程序id
@property (nonatomic, copy, readonly) NSString *sourceAppID;
/// 打开小程序来源小程序页面URL,含参数,navigateBackMiniProgram端能力使用
@property (nonatomic, copy, readonly) NSString *srcAppPage;
/// 打开小程序来源小程序页面pkgType,0-正式版、1-开发版、2-审核版、3-体验版
@property (nonatomic, strong, readonly) NSNumber *srcPkgType;
/// 打开小程序来源小程序页面appkey
@property (nonatomic, copy, readonly) NSString *srcAppKey;
/// 调起小程序时的参数,用于初始化特定页面
@property (nonatomic, copy, readonly) NSString *firstPageURL;
/// 配合百度统计,增加广告的clkid标识,可选字段
@property (nonatomic, copy, readonly) NSString *clickID;
/// 场景值
@property (nonatomic, copy, readonly) NSString *scene;
/// 打点用的ext, 注意与业务的`extraData`区分
@property (nonatomic, copy, readonly) NSDictionary *ext;
/// 小程序被调起和返回时传入的额外数据
@property (nonatomic, copy, readonly) NSDictionary *extraData;
/// 完整的调起协议
@property (nonatomic, copy, readonly) NSString *launchScheme;
/// 调起协议中的path,不带query
@property (nonatomic, copy, readonly) NSString *pathWithoutQuery;
/// 是否写入小程序打开历史,默认YES(写入历史)
@property (nonatomic, assign, readonly) BOOL isWriteHistory;
/// 值为:naviBack,返回;naviTo,打开一个小程序
@property (nonatomic, copy, readonly) NSString *naviAction;
/// 小程序启动时长流数据,用于透传
@property (nonatomic, strong) NSMutableDictionary *launchDataDic;
// 小程序和小游戏调起协议不同,增加参数区分
@property (nonatomic, assign) BBASMAPPInfoType appType;
/// 远程调试参数,启动remote-debug
@property (nonatomic, strong) BBASMRemoteDebuggerParams *debuggerParams;
/// 真机调试参数,启动local-debug
@property (nonatomic, strong) BBASMLocalDebuggerParams *localDebuggerParams;
/// 小程序打开的dispatcher,用于回调该小程序是否打开成功
@property (nonatomic, strong) BBASchemeDispatcher *dispatcher;
/// 区分是协议调起还是热启动,取值为 user | schema | sys
@property (nonatomic, assign) BBASMShowByType showByType;
///小程序错误页
@property (nonatomic, copy) NSString *backwardURL;
/// 小程序被调起传入baidusearch参数
@property (nonatomic, copy, readonly) NSDictionary *baidusearch;
///< 协议中透传的上一个l调起来源小程序的 appID
@property (nonatomic, copy, readonly) NSString *preAppId;
///< 协议中透传的小程序互调时的根来源
@property (nonatomic, copy, readonly) NSString *preSource;
/// 调起协议中的abtest参数
@property (nonatomic, copy) NSString *abTest;
/// 调起协议中的third_ext参数
@property (nonatomic, copy) NSString *thirdExt;
/// 每次单独调起的标识ID,用于串联打点
@property (nonatomic, copy) NSString *launchID;
/// web类game的url
@property (nonatomic, copy) NSString *webGameURL;
/// icon
@property (nonatomic, copy) NSString *appIcon;
/// 每次单独调起时间戳ms
@property (nonatomic, assign) NSTimeInterval startTimeStamp;
/// 调起协议中携带的开发者工具信息
@property (nonatomic, copy, readonly) NSDictionary *devToolInfo;
/// 调起协议中携带的带货信息
@property (nonatomic, copy, readonly) NSDictionary *rebateInfo;
/// 入口点击时的时间戳,调起起点
@property (nonatomic, assign) NSTimeInterval clickTimestamp;
/// 调起协议组件开始解析调起协议的起点
@property (nonatomic, strong) NSDate *dispatcherStartParseDate;

/// 调起协议中的nid参数
@property (nonatomic, copy, nullable) NSString *nid;

/// 是否允许非点击行为直接调起订阅消息面板(通过调起协议中参数设置,成功调用一次requestSubscribeFormId后会置为NO)
@property (nonatomic, assign) BOOL subscribeWithoutClick;

- (instancetype)initAppInfo:(NSDictionary *)appInfo;

/**
 * @brief 返回AppType的string
 *
 * @return 小程序返回swan,小游戏返回swangame,其他返回unknown
 */
- (NSString *)getAppTypeString;

/**
 * @brief  根据类型返回 ShowByTypeTypeString
 *
 * @return showByTypeTypeString
 */
- (NSString *)getAppShowByTypeTypeString;

/**
 * @brief 对FirstPagePath 进行重新定向,指向一个合法的 path
 *
 * @param redirectPath 要指向的页面
 */
- (void)redirectIndependentFirstPagePath:(NSString *)redirectPath;

/**
 * @breif 对 FirstPagePath ExtraData 清空(打开app时使用app.json 中默认first page)
 */
- (void)cleanupFirstPagePathAndExtraData;

/**
 * @breif 清除带货分佣信息
 */
- (void)cleanupRebateInfo;

/// debug模式下,小程序包的下载地址
@property (nonatomic, copy, readonly) NSString *appDownloadURL;

/// 更新launchID,如小程序重启时(谨慎使用,涉及打点全流程)
- (void)updateLaunchID;

/// 将数据模型转化为字典
- (NSDictionary *)toDictionary;

/// @brief 更新appInfo属性
///        之所以增加该方法,是因为挂在 App 上的 appInfo 会多线程访问
///        直接将 app.appInfo 重新赋值会有多线程访问 crash;
///        所以在更新 app.appinfo 时,使用此方法,更新内部属性即可
/// @param appInfoModel app info
- (void)updateWithInfoModel:(nonnull BBASMAPPInfoModel *)appInfoModel;

@end

NS_ASSUME_NONNULL_END