小程序引擎代理类实现

最近更新时间:2023-12-06 15:14:26

我的收藏
TCMPPSDK 提供一系列的开放接口,可以方便宿主 App 进行定制及使用宿主 App 已有的能力,实现步骤如下:

新建类实现 TMFMiniAppSDKDelegate 协议

@interface MIniAppDemoSDKDelegateImpl : NSObject <TMFMiniAppSDKDelegate>

@end

通过小程序管理类设置进小程序引擎

[TMFMiniAppSDKManager sharedInstance].miniAppSdkDelegate = [MIniAppDemoSDKDelegateImpl sharedInstance];

目前已经支持可扩展的接口列表

宿主 App 相关接口

本部分内容,为 App 和小程序引擎提供运行时需要的内容,如版本、名称、语言等信息,建议实现。
/**
* @brief SDK宿主应用名称
* 主要用于文案提示使用
*/
- (NSString *)appName;

/**
* @brief SDK宿主平台版本
* @return 返回的是小写字符串,例如1.0.0
*/
- (NSString *)getAppVersion;

/**
* @brief SDK宿主平台QUA
*/
- (NSString *)getAppQUA;

/**
* @brief SDK宿主平台的网络状态
*/
- (TMANetWorkStatus)getAppNetworkStatus;

/**
* @brief SDK宿主平台的机型信息
*/
- (NSString *)getAppIPhoneModel;


/**
* @brief 宿主设置的当前语言
*/
- (NSString *)getCurrentLocalLanguage;

/**
* @brief 剪贴板频控
*/
- (NSNumber *)getClipboardInterval;

/// 定制的UA
/// @param defaultUserAgent 默认使用的 ua
- (NSString *)customUserAgent:(NSString *)defaultUserAgent;

用户相关 API 实现

本部分内容,为用户相关内容实现,供小程序使用,建议实现,尤其是 getAppUID。
/**
* @brief SDK宿主平台的用户昵称,默认返回"TMF小程序"
*/
- (NSString *)getAppNickName;

/**
* @brief SDK宿主平台的用户头像,默认返回demo图片
*/
- (UIImage *)getAppAvatar;


/**
* @brief 获取SDK宿主平台的当前用户账号标识,一般填uin或openid
*
* 注意:返回nil会导致SDK内某些缓存失效。如果没有登录,可以填个设备号id来避免缓存失效
*/
- (NSString *_Nonnull)getAppUID;

开放接口列表

本部分内容需要宿主 App 实现后才可以正常使用。
/// 发起支付
/// @param app 小程序/小游戏实例
/// @param params 参数
/// @param completionHandler 回调结果
- (void)requestPayment:(TMFMiniAppInfo *)app params:(NSDictionary *)params completionHandler:(MACommonCallback)completionHandler;

/// login
/// @param app 小程序/小游戏实例
/// @param params 参数
/// @param completionHandler 回调结果
- (void)login:(TMFMiniAppInfo *)app params:(NSDictionary *)params completionHandler:(MACommonCallback)completionHandler;


/// checkSession
/// @param app 小程序/小游戏实例
/// @param params 参数
/// @param completionHandler 回调结果
- (void)checkSession:(TMFMiniAppInfo *)app params:(NSDictionary *)params completionHandler:(MACommonCallback)completionHandler;

/// getAccountInfoSync
/// @param app 小程序/小游戏实例
/// @param params 参数
/// @param completionHandler 回调结果
- (void)getAccountInfoSync:(TMFMiniAppInfo *)app params:(NSDictionary *)params completionHandler:(MACommonCallback)completionHandler;


/// getUserProfile
/// @param app 小程序/小游戏实例
/// @param params 参数
/// @param completionHandler 回调结果
- (void)getUserProfile:(TMFMiniAppInfo *)app params:(NSDictionary *)params completionHandler:(MACommonCallback)completionHandler;


/// getUserInfo
/// @param app 小程序/小游戏实例
/// @param params 参数
/// @param completionHandler 回调结果
- (void)getUserInfo:(TMFMiniAppInfo *)app params:(NSDictionary *)params completionHandler:(MACommonCallback)completionHandler;

UI 相关元素

本部分内容,在 TMF 小程序引擎中已经有默认实现,宿主 App 可以根据自己的需要重新实现覆盖原默认实现。
/// 展示loading
/// @param infos loading信息
- (void)showLoading:(TMALoadingInfo * _Nullable)infos;


/// 隐藏loading
- (void)hideLoading;


/// 展示toast
/// @param infos toast信息
- (void)showToast:(TMAToastInfo *)infos;


/// 隐藏toast
- (void)hideToast;


/// 展示actionSheet
/// @param title 标题
/// @param cancelButtonTitle 取消按钮标题
/// @param cancelAction 点击取消按钮触发的动作
/// @param otherButtonTitleAndActions 其他按钮及响应操作
/// @param dismissBlock actionSheet收起后需要执行的操作(一定要调用以保证功能正确!!!)
/// @param presentingViewController 展示actionSheet的vc
- (void)showActionSheetWithTitle:(nullable NSString *)title
cancelButtonTitle:(nullable NSString *)cancelButtonTitle
cancelAction:(nullable dispatch_block_t)cancelAction
otherButtonTitleAndActions:(nullable NSArray *)otherButtonTitleAndActions
dismissBlock:(nullable dispatch_block_t)dismissBlock
presentingViewController:(UIViewController *)presentingViewController;


/// 分享面板
/// 如果此方法不实现,则会调用showActionSheetWithTitle:cancelButtonTitle:cancelAction:otherButtonTitleAndActions:dismissBlock:presentingViewController:
/// @param title 标题
/// @param cancelAction 取消操作
/// @param otherButtonTitleAndActions 其他按钮及响应操作
/// @param dismissBlock 面板收起后需要执行的操作(一定要调用以保证功能正确!!!)
/// @param parentVC 呼起面板的vc
- (void)showShareViewWithTitle:(nullable NSString *)title
cancelAction:(nullable dispatch_block_t)cancelAction
otherButtonTitleAndActions:(nullable NSArray *)otherButtonTitleAndActions
dismissBlock:(nullable dispatch_block_t)dismissBlock
parentVC:(UIViewController *)parentVC;

/// 点击胶囊按钮呼起的面板
/// 如果此方法不实现,则会调用showActionSheetWithTitle:cancelButtonTitle:cancelAction:otherButtonTitleAndActions:dismissBlock:presentingViewController:
/// @param app 小程序信息
/// @param cancelButtonTitle 取消标题
/// @param cancelAction 取消操作
/// @param otherButtonTitleAndActions 其他按钮及响应操作
/// @param dismissBlock 面板收起后需要执行的操作(一定要调用以保证功能正确!!!)
- (void)showMoreButtonActionSheetWithApp:(TMFMiniAppInfo *)app
cancelButtonTitle:(nullable NSString *)cancelButtonTitle
cancelAction:(nullable dispatch_block_t)cancelAction
otherButtonTitleAndActions:(nullable NSArray *)otherButtonTitleAndActions
dismissBlock:(nullable dispatch_block_t)dismissBlock;

/// 收起所有小程序/小游戏呼起的actionSheet
- (void)clearAllActionSheet;


/// 呼起alert弹框
/// @param title 标题
/// @param message 信息
/// @param actionTitleAndblocks 按钮标题及响应操作
/// @param presentingViewController 呼起alert弹框的vc
- (void)showAlertWithTitle:(nullable NSString *)title
withMessage:(nullable NSString *)message
actionBlocks:(nullable NSArray<AlertActionInfo *> *)actionTitleAndblocks
presentingViewController:(UIViewController *)presentingViewController;

/**
* @brief 展示弹窗
*
* @param title 标题
* @param message 信息
* @param actionTitleAndblocks 按钮标题及响应操作
* @param isDismissWhenBackground 当小程序退到后台时,弹窗是否消失
* @param dismissOnClickBlank 当点击空白背景区域时是否消失
* @param presentingViewController 呼起alert弹框的vc
*/
- (void)showPopupWithTitle:(NSString *)title
message:(NSString *)message
actionBlocks:(NSArray<AlertActionInfo *> *)actionTitleAndblocks
isDismissWhenBackground:(BOOL)isDismissWhenBackground
dismissOnClickBlank:(BOOL)dismissOnClickBlank
presentingViewController:(UIViewController *)presentingViewController;



/// 宿主App可以自定义分享途径、决定展示顺序,目前使用在点击更多按钮、button组件(open-type="share")呼起的ActionSheet中
/// 1、默认渠道:QQ好友、QQ空间、微信、朋友圈(具体type参见MAUIDelegateShareViewType),由开发商决定,宿主App只能更改展示顺序
/// 2、自定义渠道:宿主App自定义(type填MAUIDelegateShareViewTypeCustomizedShare)
/// 以上两种渠道展示顺序支持混排
- (NSArray<TMASheetItemInfo *> *)customizedConfigForShare;


/// 宿主App是否处于DarkMode模式
- (BOOL)isDarkMode;

/// 宿主App可以返回一个自定义的WKWebView,目前用于
/// 1. web-view组件:需要解决web-view组件中用xhr发送post请求body丢失问题
- (WKWebView *)webViewWithConfiguration:(WKWebViewConfiguration *)configuration;

媒体相关内容

本部分内容,小程序引擎或者扩展引擎中有默认实现,宿主 App 可以根据自己的需要重新实现。
/// 扫码调用客户端的扫码模块scancode
/// @param scanPrams 扫码参数字典
/// @param navigationController 从那个页面呼起vc
/// @param completionHandler 回调结果
- (void)scanCode:(NSDictionary *)scanPrams
navigationController:(UINavigationController *)navigationController
completionHandler:(MACommonCallback)completionHandler;

/// 从选图器选择媒体
/// @param model 配置
/// @param parentVC vc
/// @param completionBlock 选择完毕后需要回传数据 根据所选类型接受 TMAPickerImageModel TMAPickerVideoModel
- (void)selectMediaFromPickerWithModel:(TMAMediaChooseConfigModel *)model
parentVC:(UIViewController *)parentVC
completionBlock:(void(^)(NSArray * _Nullable medias, NSError * _Nullable error))completionBlock;

/// 拍摄媒体
/// @param model 配置
/// @param parentVC vc
/// @param completionBlock 选择完毕后需要回传数据,根据所选类型接受TMACameraImageModel TMACameraVideoModel
- (void)selectMediaFromCameraWithModel:(TMAMediaChooseConfigModel *)model
parentVC:(UIViewController *)parentVC
completionBlock:(void(^)(id _Nullable media, NSError * _Nullable error))completionBlock;

/// 从PHAsset中获取图片数据
/// @param phAsset 媒体对象
/// @param needCompress 是否需要压缩
- (NSData *)imageDataFromPhAsset:(PHAsset *)phAsset needCompress:(BOOL)needCompress;

/// 图片预览
/// @param navigationController 呼起图片预览的导航栏
/// @param currentAbsoluteUrl 当前页面地址
/// @param absUrlsInPreviewArray 需要预览的图片
- (void)navigationController:(UINavigationController *)navigationController
presentImageWithCurrentUrl:(NSString *)currentAbsoluteUrl
imageUrlArray:(NSArray *)absUrlsInPreviewArray;

事件通知回调

本部分内容,为小程序生命周期函数中部分事件通知回调,宿主 App 可以在对应的事件发生时添加自己的处理逻辑。
// 处理启动过程中发生的错误
- (void)handleStartUpError:(NSError *_Nonnull)error
app:(NSString *_Nullable)app
parentVC:(UIViewController *_Nonnull)parentVC;

// 小程序启动成功
- (void)handleStartUpSuccessWithApp:(TMFMiniAppInfo *_Nonnull)app;

日志输出

/// 打印Log
/// @param level log级别,参考PLTLogLevel
/// @param msg log信息
- (void)log:(MALogLevel)level msg:(NSString *)msg;

自定义配置

/// 处理当前app对于小程序引擎的一些配置项

/// @param key 配置项key及支持的功能,参见TMAConfigDefine.h定义
/// 自定义胶囊按钮关闭图标实例
- (NSString*)stringWithConfigKey:(NSString *)key {
    if([key isEqualToString:TMA_SK_MINIAPP_CloseButton]) {
        return [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"white_close-circle.png"];
    } else if([key isEqualToString:TMA_SK_MINIAPP_CloseButtonDark]) {
        return [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"dark_close-circle.png"];
    }
    return nil;
}

截屏、录屏事件和添加水印

// 录屏状态回调
- (void)applet:(TMFMiniAppInfo *)appletInfo screenCaptureStatusChanged:(BOOL)isCapture atPagePath:(NSString *)pagePath;

// 截屏回调
- (void)appletDidTakeScreenshot:(TMFMiniAppInfo *)appletInfo atPagePath:(NSString *)pagePath;

// 添加水印
- (nullable UIView *)appletCustomizeWatermarkView:(TMFMiniAppInfo *)appletInfo;