Cobub无码埋点关键技术的实现

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

 一、无码埋点的实现流程 

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

 二、实现流程中的技术点 

可视化视图圈选

实现自定义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对应的事件。

时间: 2024-10-27 19:46:56

Cobub无码埋点关键技术的实现的相关文章

Android无埋点数据收集SDK关键技术解析

前言 本文基于网易乐得无埋点数据收集SDK,无埋点数据收集SDK用于向大数据平台提供全量,完整,准确的客户端数据. Android端无埋点数据收集SDK实现中涉及到比较关键的技术点有: 用字节码插桩的方式实现Android端的AOP("Hook") 唯一定位界面上任何控件的ViewID Fragment页面的合理划分 自定义数据收集DSL,用于线上配置,即时收集定制的业务数据 关于第一点Android端AOP的实现,之前的一篇文章Android AOP之字节码插桩已经做了详细的阐述.本

无码系列-2-代码架构空想【华为云技术分享】

无码系列-2-代码架构空想 原文地址:https://www.cnblogs.com/huaweicloud/p/12016529.html

《无码的青春》第七章 御姐

之前我们各有各的故事,各有各的守护,然而今天却成了同一类人,失去了各自的女神,失去了自己的信仰,没有了牵挂,也不再需要对什么人负责.四个单身男人,在这个浮华的城市里尽情的释放着过剩的荷尔蒙.周末我们会聚在道哥的酒吧里,在浮光掠影的酒精和静静的音乐中沉沦,乃至迷失了自我.谈不上堕落,我们只是不再属于某一个女人,于是,我们让自己属于所有的女人.终有一天,我们会发现自己变了,甚至变成了自己曾经最讨厌的人的模样.当天空闭上眼睛时,便迎来了夜的黑,但是这黑夜从来不是永恒的,总会有那么一束阳光吻醒沉睡的天空

互联网DSP广告系统架构及关键技术解析

互联网DSP广告系统架构及关键技术解析 宿逆 关注 1.9 2017.10.09 17:05* 字数 8206 阅读 10271评论 2喜欢 60 广告和网络游戏是互联网企业主要的盈利模式 广告是广告主通过媒体以尽可能低成本的方式与用户达成接触的商业行为.也就是说按照某种市场意图接触相应人群,影响其中潜在用户,使其选择广告主产品的几率增加,或对广告主品牌产生认同,通过长期的影响逐步形成用户对品牌的转化. 一个好的DSP系统需要满足: 拥有强大的RTB(Real-Time Bidding)的基础设

5G课程 第2节 5G的关键技术

5G技术的性能指标: 峰值速率.体验速率.用户面延迟.移动性.连接密度.能效.频谱效率.区域吞吐量.可靠性.带宽 ? 但是,并不说我们的网络就必须要同时满足所有指标. 根据不同的应用场景,5G目前又划分了三个网络: 增强型移动宽带 (eMBB):一般的应用场景就是5G手机等,对大部分指标要求比较高 大规模机器类型通信(mMTC):一般应用于工业物联网,设备密集等场景,对连接密度要求高. 超可靠低延时通信(URLCC):一般应用于自动驾驶技术,通过下图,我们可以此类应用一般要求移动性强.延迟时间短

Caffe关键技术之仿真(一)

源 从当年流行的”编程高手必读Linux源码“,到市面上各色各样的XXX源码解析.剖析,我们已经看过太多太烂的源码分析. 读一份源码最痛之处在于,突然蹦出一大段代码,数据结构一个认不得,也不知道变量从何而来,函数更看都不懂. 似乎,那些很烂的作者,总喜欢迎难而上,你越不喜欢大段代码,他就每次首先贴一大段代码. 丝毫不对顺序做优化,也不知道标记出什么是重要的,什么是不重要的,连一份概况都没有. 这不叫源码分析,这叫随堂笔记. 高中时候,曾经拜读过侯捷老师的<深入浅出MFC>,其中最有趣的是它的第

中文事件抽取关键技术研究(谭红叶 博士毕业论文)

中文事件抽取关键技术研究(谭红叶 博士毕业论文) 事件抽取的定义 ACE2005 将该项任务定义为:识别特定类型的事件,并进行相关信息的确定和抽取,主要的相关信息包括:事件的类型和子类型.事件论元角色等.根据这个定义,可将事件抽取的任务分成两大核心子任务:(1)事件的检测和类型识别:(2)事件论元角色的抽取.除此以外,由于绝大部分的论元角色都是实体,因此实体的识别也是事件抽取的一项基本任务. 信息抽取的定义 Andrew McCallum所提出的定义具有普遍意义.他将信息抽取定义为(A.McCa

Java进阶(三)多线程开发关键技术

原创文章,转载请务必将下面这段话置于文章开头处. 本文转发自Jason's Blog,原文链接 http://www.jasongj.com/java/multi_thread/ sleep和wait到底什么区别 其实这个问题应该这么问--sleep和wait有什么相同点.因为这两个方法除了都能让当前线程暂停执行完,几乎没有其它相同点. wait方法是Object类的方法,这意味着所有的Java类都可以调用该方法.sleep方法是Thread类的静态方法. wait是在当前线程持有wait对象锁

如何才能拍摄出高清无码?(附源码下载!)

要想拍摄出高清无码,摄像头很关键. 摄像头有两个重要的参数,一个是分辨率,一个是帧频. 附:设备测试demo源码下载 一.笔记本的自带摄像头的参数 Size就是摄像头的分辨率,MaxFrameRate是指摄像头采集能达到的最大帧频. 当然,我这个摄像头比较low,录制高清无码肯定是不行的. 二.外接摄像头测出来的参数. 附:设备测试demo源码下载 三.选定摄像头的分辨率和帧频来录制视频 现在选定的是1280*720,帧频为30fps. 录制得到的视频的参数信息如下: 附:视频录制demo源码下