# 自定义事件

iOS SDK 提供部分功能事件自定义,通过[QYSDK sharedSDK]单例的customActionConfig方法获取QYCustomActionConfig自定义事件配置类,该类为单例模式。QYSessionViewController类中也存在一些回调事件。

# 属性列表

QYCustomActionConfig主要以回调形式实现事件自定义,提供较多block属性设置:

属性 类型 说明
actionBlock QYActionBlock 部分通用动作事件,目前主要用于客服相关
linkClickBlock QYLinkClickBlock 所有消息中的链接回调
botClick QYBotClickBlock 机器人部分模板消息点击事件
pushMessageClick QYLinkClickBlock 七鱼推送消息点击事件
showBotCustomInfoBlock QYShowBotCustomInfoBlock 机器人自定义信息回调
commodityActionBlock QYSelectedCommodityActionBlock 订单卡片按钮点击事件
extraClickBlock QYExtraViewClickBlock 消息扩展视图点击事件
notificationClickBlock QYSystemNotificationClickBlock 系统消息点击
eventClickBlock QYEventBlock 消息内部分点击事件数据透传
customButtonClickBlock QYCustomButtonBlock 自定义事件按钮点击事件
avatarClickBlock QYAvatarClickBlock 消息头像点击事件
photoPermissionBlock QYPermissionBlock 相册权限请求回调
cameraPermissionBlock QYPermissionBlock 相机权限请求回调
microPermissionBlock QYPermissionBlock 麦克风权限请求回调
pullRoamMessage BOOL 账号登录后是否拉取漫游消息

# 接口列表

提供如下接口:

接口 说明
setDeactivateAudioSessionAfterComplete: 设置录制或者播放语音完成以后是否自动deactivate
showQuitWaiting: 显示退出排队提示

QYSessionViewController提供如下事件回调:

接口 说明
buttonClickBlock: 输入区域上方工具栏内的按钮点击回调
evaluationBlock: 人工满意度评价事件
robotEvaluationBlock: 机器人满意度评价事件
preSessionEvaluationBlock: 会话前强制人工满意度评价事件,自定义视图写在此回调中(web端可配置关闭,默认关闭)

如果需要参考评价事件的使用示例,请查看满意度评价 (opens new window)

# 请求客服事件

V4.6.0 版本后,SDK 完善了客服相关事件的对外接口,可以拦截所有请求客服前和请求客服后的事件,需要设置QYCustomActionConfig中的actionBlock属性,该block返回一个QYAction对象,此对象定义如下:

/**
 *  QYAction定义了部分动作,通过type区分不同情形,并调用各自对应的回调
 *  若需要获取这部分动作,请在QYCustomActionConfig单例中设置QYAction属性
 */
@interface QYAction : NSObject

/**
 *  动作类型
 */
@property (nonatomic, assign) QYActionType type;

/**
 *  请求客服前调用
 */
@property (nonatomic, copy) QYRequestStaffBeforeBlock requestStaffBeforeBlock;

/**
 *  请求客服后调用
 */
@property (nonatomic, copy) QYRequestStaffAfterBlock requestStaffAfterBlock;

@end

其中 QYActionType 目前定义了如下动作场景:

/**
 *  动作类型
 */
typedef NS_ENUM(NSInteger, QYActionType) {
    QYActionTypeNone = 0,
    QYActionTypeRequestStaffBefore,     //请求客服前
    QYActionTypeRequestStaffAfter,      //请求客服后
    QYActionTypeSessionAllocation       //会话分配
};

QYRequestStaffBeforeBlock为请求客服前回调的block,该事件给出了当前请求客服是何种场景,开发者可针对不同场景做定制化处理,其定义如下:

/**
 *  通用回调,一般用于告诉SDK是否继续进行后续操作
 *  例如:设置了请求客服前回调后,通过调用此QYCallback来继续或是中断请求客服
 */
typedef void (^QYCallback)(BOOL continueIfNeeded);

/**
 *  请求客服场景
 */
typedef NS_ENUM(NSInteger, QYRequestStaffBeforeScene) {
    QYRequestStaffBeforeSceneNone,               //无需关心的请求客服场景
    QYRequestStaffBeforeSceneInit,               //进入会话页面,初次请求客服
    QYRequestStaffBeforeSceneRobotUnable,        //机器人模式下告知无法解答,点击消息中人工按钮
    QYRequestStaffBeforeSceneNavHumanButton,     //机器人模式下,点击右上角人工按钮
    QYRequestStaffBeforeSceneActiveRequest,      //主动请求人工客服
    QYRequestStaffBeforeSceneChangeStaff,        //切换人工客服
};

/**
 *  请求客服前回调
 *
 *  @param scene 请求客服场景
 *  @param onlyHuman 是否只请求人工客服
 *  @param callback 处理完成后的回调,若需继续请求客服,则调用callback(YES);若需停止请求,调用callback(NO)
 */
typedef void (^QYRequestStaffBeforeBlock)(QYRequestStaffBeforeScene scene, BOOL onlyHuman, QYCallback callback);

QYRequestStaffAfterBlock为请求客服后回调的block,其中info为新会话的相关信息,包括客服ID、昵称、头像等,block定义如下:

/**
 *  请求客服后回调
 *
 *  @param info 会话相关信息
 *  @param error 错误信息
 */
typedef void (^QYRequestStaffAfterBlock)(NSDictionary *info, NSError *error);

以下为客服相关事件处理的示例代码:

QYActionBlock actionBlock = ^(QYAction *action) {
    if (action.type == QYActionTypeRequestStaffBefore) {
        action.requestStaffBeforeBlock = ^(QYRequestStaffBeforeScene scene, BOOL onlyHuman, QYCallback callback) {
            NSLog(@"当前请求客服的场景是:%lld", (long long)scene);
            ......
            
            //若继续请求客服
            if (callback) {
                callback(YES);
            }
            //若中断请求客服
            if (callback) {
                callback(NO);
            }
        }
    } else if (action.type == QYActionTypeRequestStaffAfter) {
        action.requestStaffAfterBlock = ^(NSDictionary *info, NSError *error) {
            if (error) {
                NSLog(@"请求客服失败,error:%@", error);
            } else {
                NSLog(@"请求客服成功,info:%@", (info ? info : @"none"));
            }
        };
    }
};
[[QYSDK sharedSDK] customActionConfig].actionBlock = actionBlock;

注:在 V4.4.0 版本中,仅可拦截请求客服前事件;若要拦截,请设置QYCustomActionConfig中的requestStaffBlock,处理完成后,请主动调用该block中的completion回调,并设置needed参数,YES 表示继续请求客服,NO 表示中断请求客服。