Cobub无码埋点关键技术实现流程(附图)

随着大数据时代的到来,数据采集也已经变的越来越重要。前端埋点作为一个比较成熟的数据接入手段被广泛应用着。目前埋点分为两种方式,有码与无码埋点。有码埋点比较容易理解,即调用SDK的API,在代码中插入埋点的相关代码,实现用户行为采集。由于我们在开发项目的时候,埋点都是手动的,每次业务需求的改变都要到处埋点,而无码埋点,即不需要手动插入代码,只需要前期进行相关配置,SDK自动采集用户行为,极大程度避免了因需求变更、埋点错误等原因导致的重新埋点繁复工作。本文主要介绍无码埋点的技术实现。

无码埋点的实现流程

1.可视化视图圈选,在页面上会出现浮动的圆圈,拖动圆圈至想配置事件的控件上,将会弹出输入事件的弹框。 2.在上一步的弹框中输入自定义的事件名称,名称将会和视图的viewPath绑定起来。viewPath是视图的唯一标识,在下文中将详细讲解。 3.用户点击了控件,判断控件是否绑定过事件,如绑定则进行事件上传。

实现流程中的技术点

可视化视图圈选实现

自定义UIWindow的子类,当做悬浮小圆圈,添加UIPanGestureRecognizer手势,根据手势的位移,设置悬浮框的位移。手势停止时获取悬浮窗中心点的坐标。 遍历主window上的子视图,找到包含上述悬浮窗中心点且能响应用户交互的最里层视图,即为用户可以圈选的视图。 参考iOS控件的消息传递链,有个核心方法。UIView hitTest:(CGPoint)point withEvent:(UIEvent *)event。此API自动遍历子视图,找到包含point的视图,event传nil。由于event参数是nil,最终找到的视图并不一定是能响应用户手势的视图,如果不能响应则遍历其父视图,直到找到能响应用户行为的视图。

圈选视图绑定事件

视图唯一标识viewPath生成,上述步骤已经拿到了圈选的视图。如何确定视图的viewPath也是重点。viewPath需要整个应用唯一,才可以区别不同的事件。由于是无码,所以只能从视图本身的属性去分析。我们可以把App的视图结构理解成树的概念,树的根节点是UIWindow,树的枝干由UIViewController和UIView组成,叶子节点都是UIView。那么从根节点到叶子节点的路径可以看做是唯一的。也就是视图的viewPath。下面介绍下实现的逻辑,viewPath由两部分组成,第一部分是节点路径,另一部分是与之对应的节点index。节点路径是由每个节点的Class拼接而成,节点index,就是节点在父节点中的下标,比如子视图在父视图的subviews数组中的下标。下图是遍历节点的逻辑图。

计算节点的index,这个步骤,有种特殊的视图需要注意,可复用视图的index是跟数据源相关的,比如UITableViewCell,此类视图的index不能使用父视图的subviews的下标代替,应该使用数据源的下标代表,比如cell的indexPath.section:indexPath.row。下面给出一个简单视图和可复用视图的viewPath的例子。TestViewController-UIView-UIButton&0-0-0和TableViewController-UITableView-UITableViewCell&0-0-1:0。 如何检测用户触发了绑定了事件ID的视图也是重点,此处运用的核心技术是runtime中Method Swizzle。下面介绍一下针对不同类型的控件,如何hook相应的方法。 1. UIControl类型的控件hook – (void)sendAction:(SEL) to:(id)target forEvent:(UIEvent *)event 2. UIScrollView,UITextView,UITableView,UICollectionView 类型的控件,先hook -(void)setDelegate:(id)delegate 方法,然后再hook想要采集事件的代理方法,例如 textViewDidBeginEditing 、tableview:(UITableView *)tableview didSelectRowAtIndexPath:(NSIndexPath *)indexPath 等。 3. 带手势事件的视图 hook -(void)addGestureRecognizer方法,并在方法实现中给手势对象添加新的target和action ,- (void)addTarget:(id)target action:(SEL)action。

总结

无码埋点的关键技术,就是以上分析的几点,首先通过可视化圈选拿到需要绑定事件视图,并生成唯一标识viewPath,通过hook系统控件的方法,拿到用户触发的视图,生成视图的viewPath与本地的事件列表比对,比对成功则上传viewPath对应的事件。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一个会写诗的程序员的博客

bootstrap-table 前端分页,刷新事件代码实例

参考文档: http://bootstrap-table.wenzhixin.net.cn/

1.1K1
来自专栏c#开发者

打包并自动安装sql数据库

打包,并自动安装SQL数据库 应一位网友的需求,并修正了MVP李洪根".NET平台下WEB应用程序的部署(安装数据库和自动配置)"中的osql用法错误,已测试通...

3143
来自专栏码生

ReactNative 面试题

今天有一个 ReactNative 的面试。 时间紧迫,临时写了几个问题,初级面试问题。 都是关键字

8893
来自专栏TechBox

跟着官方文档学习3D Touch前言(一)app外3D Touch—Home Screen Quick Actions(二)app内的3D Touch - Peek and Pop名词解释

2544
来自专栏Google Dart

为Flutter应用程序添加交互性 顶

你如何修改你的应用程序,使其对用户输入做出反应? 在本教程中,您将为仅包含非交互式小部件的应用添加交互性。 具体来说,您将通过创建一个管理两个无状态小部件的自定...

2272
来自专栏java学习

面试题27(关于 java 的异常处理机制的叙述哪些正确?)

? 关于 java 的异常处理机制的叙述哪些正确? A)不论程序是否发生错误及捕捉到异常情况,都会执行finally部分 B) 当try区段的程序发生异常时...

4044
来自专栏王磊的博客

一些好用的开源控件

      工作两年,一直都在做些编码方面的表面功夫,实现了很多很炫的功能,在此写下一些体验。有些比较小的dll文件我会发上来,如果是开源组织的代码我会把地址附...

3856
来自专栏葡萄城控件技术团队

MultiRow发现之旅(四)- 使用MultiRow开发WinForm应用(附源码)

前文回顾 MultiRow发现之旅(一)- 高效模板设计器 MultiRow发现之旅(二)- 详解属性管理器 MultiRow发现之旅(三)- 模板管理器和Ta...

24410
来自专栏潇涧技术专栏

Mou and StackEdit and Mathjax

本文记录使用Mou和Stackedit中出现的一些问题,使其能够正常渲染带数学公式的文章

991
来自专栏娱乐心理测试

小程序完整demo

2535

扫码关注云+社区

领取腾讯云代金券