iOS全埋点解决方案-手势采集

打印 上一主题 下一主题

主题 776|帖子 776|积分 2328

前言

​        随着科技以及业务的发展,手势的应用也越来越普及,因此对于数据采集,我们要考虑如果通过全埋点来实现手势的采集。
一、手势识别器

​        苹果为了降低开发者在手势事件处理方面的开发难度,定义了一个抽象类 UIGestureRecognizer 来协助开发者。UIGestureRecognizer 是具体手势识别器的抽象基类,它定义了一组可以为所有具体手势识别器配置的常见行为。它还可以通过设置委托(即实现了 UIGestureRecognizerDelegate 协议的对象),来支持对某些行为进行更细粒度的定制。
​        手势识别器必须被添加在一个特定的视图上(比如 UILabel、UIImageView 等控件),即需要通过调用 UIView 类中的 - addGestureRecognizer: 方法进行添加。手势识别器也是用了 Target-Action 设计模式。当我们为一个手势识别器添加一个或者多个 Target-Action 后,在视图上进行触摸操作时,一旦系统识别了该手势,就会向所有的 Target 对象发送消息,并执行 Action 方法。虽然手势识别器和 UIControl 类一样,都是使用了 Target-Action 设计模式,但是手势识别器并不会将消息交由 UIApplication 对象来进行发送。因此,我们无法使用与 UIControl 控件相同的处理方式,即通过响应者链的方式来实现对手势操作的全埋点。
​        由于 UIGestureRecognizer 是一个抽象基类,所以它并不会处理具体的手势。因此,对于轻拍(UITapGestureRecognizer)、长按(UILongPressGestureRecognizer)等具体的手势触摸事件,需要使用相应的子类即具体的手势识别器进行处理。
常见的具体手势识别器有:

  • UITapGestureRecognizer:轻拍手势
  • UILongPressGestureRecognizer:长按手势
  • UIPinchGestureRecognizer:捏合(缩放)手势
  • UIRotationGestureRecognizer:旋转手势
  • UISwipeGestureRecognizer:轻扫手势
  • UIPanGestureRecognizer:平移手势
  • UIScreenEdgePanGestureRecognizer:屏幕边缘平移手势
​        给上面所有的具体手势识别器添加 Target-Action 的方法都是相同的,常见的主要是通过以下的两个方法进行添加。

  • initWithTarget:target action:
  • addTarget:action:
    详细的定义参考如下:
    1. /**
    2. 指定初始化方法
    3. 通过添加一个 Target-Action 进行初始化,
    4. 当初始化的手势识别器对象,识别到触摸手势时,会向 Target 对象发送消息,即调用 Action 方法
    5. @param target 需要发送消息的 Target 对象
    6. @param action 向 Target 对象发送的消息,即方法名
    7. @return 初始化的对象
    8. */
    9. - (instancetype)initWithTarget:(nullable id)target action:(nullable SEL)action NS_DESIGNATED_INITIALIZER;
    10. /**
    11. 向一个手势识别器添加一个 Target-Action
    12. 可以多次调用此方法,给一个手势识别器对象添加多个 Target-Action 。
    13. 如果已经添加了一个 Target-Action,再次添加相同的 Target-Action 时,会被忽略。
    14. @param target 需要发送消息的 Target 对象
    15. @param action 向 Target 对象发送的消息,即方法名
    16. */
    17. - (void)addTarget:(id)target action:(SEL)action;
    复制代码
​    在实际的开发过程中,使用比较多的是 UITapGestureRecognizer 和 UILongPressGestureRecognizer 两个手势识别器,这两个手势识别器分别是处理轻拍手势和长按手势。
二、手势全埋点

​        在数据采集中,一般只需要采集常见控件(UILabel、UIImageView)的轻拍和长按手势。
所以,我们分别介绍如何实现控件轻拍和长按手势的全埋点。
2.1 UITapGestureRecognizer 全埋点

​        为了采集控件的轻拍手势,我们可以通过 Method Swizzling 交换 UITapGestureRecognizer 类的添加 Target-Action 的方法,从而可以添加一个新的 Target-Action,并在新添加的 Action 方法中触发 $AppClick 事件,从而就可以达到采集控件轻拍手势全埋点的效果。
在 UITapGestureRecognizer 类中,用于添加 Target-Action 方法有两个:
• - initWithTarget:action:
• - addTarget:action:
因此,我们需要对这两个方法分别进行交换。
第一步:创建 UITapGestureRecognizer 分类 UIGestureRecognizer+SensorsData,并实现 +load 类方法,在 + load方法中,进行 - initWithTarget:action: 和 - addTarget:action: 的方法交换。
  1. #import "UIGestureRecognizer+SensorsData.h"
  2. #import "NSObject+SASwizzler.h"
  3. #import "SensorsAnalyticsSDK+Track.h"
  4. @implementation UITapGestureRecognizer (SensorsData)
  5. + (void)load {
  6.     [UITapGestureRecognizer sensorsdata_swizzleMethod:@selector(sensorsdata_initWithTarget:action:) withMethod:@selector(initWithTarget:action:)];
  7.     [UITapGestureRecognizer sensorsdata_swizzleMethod:@selector(addTarget:action:) withMethod:@selector(sensorsdata_addTarget:action:)];
  8. }
  9. - (instancetype)sensorsdata_initWithTarget:(id)target action:(SEL)action {
  10.     [self sensorsdata_initWithTarget:target action:action];
  11.     [self addTarget:target action:action];
  12.     return self;
  13. }
  14. - (void)sensorsdata_addTarget:(id)target action:(SEL)action {
  15.     [self sensorsdata_addTarget:target action:action];
  16.    
  17.     // 新增 Target-Action, 用于触发 $AppClick 事件
  18.     [self sensorsdata_addTarget:self action:@selector(sensorsdata_trackTapGestureAction:)];
  19. }
  20. - (void)sensorsdata_trackTapGestureAction:(UITapGestureRecognizer *)sender {
  21.     [[SensorsAnalyticsSDK sharedInstance] trackAppClickWithView:view properties:nil];
  22. }
复制代码
第二步:在 - sensorsdata_trackTapGestureAction: 方法中判断要采集的控件
  1. - (void)sensorsdata_trackTapGestureAction:(UITapGestureRecognizer *)sender {
  2.     UIView *view = sender.view;
  3.     // 暂定只采集 UILabel 和 UIImageView
  4.     BOOL isTrackClass = [view isKindOfClass:UILabel.class] || [view isKindOfClass:UIImageView.class];
  5.     if (!isTrackClass) {
  6.         return;
  7.     }
  8.     [[SensorsAnalyticsSDK sharedInstance] trackAppClickWithView:view properties:nil];
  9. }
复制代码
第三步:测试验证
  1. {
  2.   "event" : "$AppClick",
  3.   "time" : 1648892963385,
  4.   "propeerties" : {
  5.     "$model" : "x86_64",
  6.     "$manufacturer" : "Apple",
  7.     "$element_type" : "UIImageView",
  8.     "$lib_version" : "1.0.0",
  9.     "$os" : "iOS",
  10.     "$app_version" : "1.0",
  11.     "$screen_name" : "ViewController",
  12.     "$os_version" : "15.2",
  13.     "$lib" : "iOS"
  14.   }
  15. }
复制代码
2.2 UILongPressGestureRecognizer 全埋点

​        对于 UILongPressGestureRecognizer 来说,其实现逻辑与 UITapGestureRecognizer 基本上是相同的。

来源:https://www.cnblogs.com/r360/p/16172988.html
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

冬雨财经

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表