美文网首页
iOS 全埋点- 手势事件 (5)

iOS 全埋点- 手势事件 (5)

作者: smile_frank | 来源:发表于2022-02-15 16:11 被阅读0次

    写在前面

    传送门:

    前面的系列章节可以查看上面连接,本章节主要是介绍 iOS全埋点序列文章(5)全埋点- 手势事件

    前言

    项目开发中,一般只需要采集常见控件 (UILabelUIImageView)的轻拍和长按手势。 接下来,基于以上内容,我们分别介绍如何实现手势识别器轻拍和长按手势的全埋点。

    UITapGestureRecognizer全埋点

    初始思路
    采集控件的轻拍手势,我们可以通过Method SwizzlingUITapGestureRecognizer类中添加Target-Action的方法,添加一个新的 Target-Action,并在新添加的Action中触发$AppClick事件,进而实现控件 轻拍手势全埋点。

    UITapGestureRecognizer类中,用于添加Target-Action的方法有两 个:

    • initWithTarget:action:
    • addTarget:action:

    因此,我们需要对上述两个方法分别进行交换。

    下面我们介绍详细的实现步骤。

    第一步:创建UIGestureRecognizer的类别CountData

    UITapGestureRecognizer+CountData.h 定义如下:

    #import <UIKit/UIKit.h>
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface UITapGestureRecognizer (CountData)
    
    @end
    
    NS_ASSUME_NONNULL_END
    

    第二步:UITapGestureRecognizer+CountData.m 文件中实现+load类方法,并在+load类方法中分别交换- initWithTarget:action:- addTarget:action: 方法

    #import "UITapGestureRecognizer+CountData.h"
    #import "NSObject+Swizzler.h"
    #import "SensorsAnalyticsSDK.h"
    
    @implementation UITapGestureRecognizer (CountData)
    
    +(void)load {    
        /*交换initWithTarget:action:方法*/
        [UITapGestureRecognizer sensorsdata_swizzleMethod:@selector(initWithTarget:action:) withMethod:@selector(countData_initWithTarget:action:)];
        /*交换addTarget:action:方法*/
        [UITapGestureRecognizer sensorsdata_swizzleMethod:@selector(addTarget:action:) withMethod:@selector(countData_addTarget:action:)];
    }
    
    - (instancetype)countData_initWithTarget:(id)target action:(SEL)action {
        // 调用原始的初始化方法进行对象初始化
        [self countData_initWithTarget:target action:action];
        // 调用添加Target-Action的方法,添加埋点的Target-Action
        // 这里其实调用的是-countData_addTarget:action:的实现方法,因为已经进行交换
        [self addTarget:target action:action];
        return self;
    }
    
    - (void)countData_addTarget:(id)target action:(SEL)action {
        //  调用原始的方法,添加Target-Action
        [self countData_addTarget:target action:action];
        //新增target-action,用于触发$AppClick事件
        [self countData_addTarget:self action:@selector(countData_trackTapGestureAction:)];
    }
    
    -(void)countData_trackTapGestureAction:(UITapGestureRecognizer *)sender {
        // 获取手势识别器的控件
        UIView *tapView =  sender.view;
        // 暂时只处理UILabel和UIbutton两种控件
        BOOL isTrackClass = [tapView isKindOfClass:[UILabel class]] || [tapView isKindOfClass:[UIImageView class]];
        if (!isTrackClass) {
            return;
        }
        
        [[SensorsAnalyticsSDK sharedInstance]track:@"UITapgestureREcoginzer手势" properties:nil];
    }
    @end
    

    上述方法暂时只支持UIImageViewUILabel这两种控件,对于其他控件,若有需求,可自行扩展。

    UILongPressGestureRecognizer全埋点

    方法原理和上面类似,创建UILongPressGestureRecognizer的分类。

    我直接在UITapGestureRecognizer+CountData.h中增加,具体代码如下:

    #import <UIKit/UIKit.h>
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface UITapGestureRecognizer (CountData)
    
    @end
    
    
    @interface UILongPressGestureRecognizer (CountData)
    
    @end
    
    NS_ASSUME_NONNULL_END
    
    

    分类.m中实现代码如下:

    
    @implementation UILongPressGestureRecognizer (CountData)
    
    +(void)load {
        
        /*交换initWithTarget:action:方法*/
        [UILongPressGestureRecognizer sensorsdata_swizzleMethod:@selector(initWithTarget:action:) withMethod:@selector(countData_initWithTarget:action:)];
        /*交换addTarget:action:方法*/
        [UILongPressGestureRecognizer sensorsdata_swizzleMethod:@selector(addTarget:action:) withMethod:@selector(countData_addTarget:action:)];
    }
    
    - (instancetype)countData_initWithTarget:(id)target action:(SEL)action {
        // 调用原始的初始化方法进行对象初始化
        [self countData_initWithTarget:target action:action];
        // 调用添加Target-Action的方法,添加埋点的Target-Action
        // 这里其实调用的是-countData_addTarget:action:的实现方法,因为已经进行交换
        [self addTarget:target action:action];
        return self;
    }
    
    - (void)countData_addTarget:(id)target action:(SEL)action {
        //  调用原始的方法,添加Target-Action
        [self countData_addTarget:target action:action];
        //新增target-action,用于触发$AppClick事件
        [self countData_addTarget:self action:@selector(countData_trackLongPressGestureAction:)];
    }
    
    -(void)countData_trackLongPressGestureAction:(UILongPressGestureRecognizer *)sender {
        
        // 手势处于UIGestureRecognizerStateEnded状态时,才触发$AppClick事件
        if (sender.state != UIGestureRecognizerStateEnded){
            return;
        }
        // 获取手势识别器的控件
        UIView *tapView =  sender.view;
        // 暂时只处理UILabel和UIbutton两种控件
        BOOL isTrackClass = [tapView isKindOfClass:[UILabel class]] || [tapView isKindOfClass:[UIImageView class]];
        if (!isTrackClass) {
            return;
        }
        
        [[SensorsAnalyticsSDK sharedInstance]track:@"UILongPressGestureRecognizer手势" properties:nil];
    }
    
    @end
    

    注意点:

    我们都知道,对于任何一个手势,其实都有不同的状态,比如:

    • UIGestureRecognizerStateBegan
    • UIGestureRecognizerStateChanged
    • UIGestureRecognizerStateEnded
      因此,为了解决上面的问题,我们可以设计只在手势处于 UIGestureRecognizerStateEnded状态时,才触发$AppClick事件。

    最后

    对于其他手势事件全埋点,实现思路都是相同的。如果读者有实际需求,可以按照UITapGestureRecognizerUILongPressGestureRecognizer全埋点的实现方案自行扩展。

    相关文章

      网友评论

          本文标题:iOS 全埋点- 手势事件 (5)

          本文链接:https://www.haomeiwen.com/subject/hdlllrtx.html