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相应的方法。
- UIControl类型的控件hook - (void)sendAction:(SEL) to:(id)target forEvent:(UIEvent *)event
- UIScrollView,UITextView,UITableView,UICollectionView 类型的控件,先hook -(void)setDelegate:(id)delegate 方法,然后再hook想要采集事件的代理方法,例如 textViewDidBeginEditing 、tableview:(UITableView *)tableview didSelectRowAtIndexPath:(NSIndexPath *)indexPath 等。
- 带手势事件的视图 hook -(void)addGestureRecognizer方法,并在方法实现中给手势对象添加新的target和action ,- (void)addTarget:(id)target action:(SEL)action。
三、总结
无码埋点的关键技术,就是以上分析的几点,首先通过可视化圈选拿到需要绑定事件视图,并生成唯一标识viewPath,通过hook系统控件的方法,拿到用户触发的视图,生成视图的viewPath与本地的事件列表比对,比对成功则上传viewPath对应的事件。
新一代Java版低成本、私有化、高性能用户行为分析系统 C4J上线啦!
Cobub开源社区交流QQ群:194022996
Cobub无码埋点关键技术的实现的更多相关文章
- Android无埋点数据收集SDK关键技术
前言 鉴于日益强烈的精细化运营需求,网易乐得从去年开始构建大数据平台,<<无埋点数据收集SDK>>因此立项,用于向大数据平台提供全量,完整,准确的客户端数据. << ...
- 互联网DSP广告系统架构及关键技术解析
互联网DSP广告系统架构及关键技术解析 宿逆 关注 1.9 2017.10.09 17:05* 字数 8206 阅读 10271评论 2喜欢 60 广告和网络游戏是互联网企业主要的盈利模式 广告是广告 ...
- DSP广告系统架构及关键技术解析(转)
广告和网络游戏是互联网企业主要的盈利模式 广告是广告主通过媒体以尽可能低成本的方式与用户达成接触的商业行为.也就是说按照某种市场意图接触相应人群,影响其中潜在用户,使其选择广告主产品的几率增加,或对广 ...
- Excel催化剂开源第23波-VSTO开发辅助录入功能关键技术
Excel催化剂开源第23波-VSTO开发辅助录入功能关键技术 Excel催化剂 2019.01.12 14:10* 字数 2948 阅读 41评论 0喜欢 0 编辑文章 在Excel催化剂的几大 ...
- 在线公开课 | 5G时代的视频云服务关键技术与实践
5G时代来临在即,视频技术将会如何发展呢?基于视频云服务的技术开发又有怎样的变化呢?为此,京东云视频云产品研发部高级总监魏伟为大家做出了详细解读. 魏伟拥有10多年视频行业研发经验,先后从事于AVS标 ...
- 5G关键技术评述
业内重大事件: 张 平:无线通信领域专家,北京邮电大学教授,博士生导师,现任北京邮电大学无线新技术研究所(WTI)所长.泛网无线通信教育部重点实验室主任以及中德软件研究所副所长.张平教授是国家宽带无 ...
- Java进阶(三)多线程开发关键技术
原创文章,同步发自作者个人博客,转载请务必以超链接形式在文章开头处注明出处http://www.jasongj.com/java/multi_thread/. sleep和wait到底什么区别 其实这 ...
- 实时视频应用之QoS关键技术分析
转自:http://www.aiweibang.com/m/detail/104476372.html?from=p 随着WebRTC标准的逐步推广,实时音视频通讯技术受到越来越多公司和技术人员的关注 ...
- 大数据 --> 大数据关键技术
大数据关键技术 大数据环境下数据来源非常丰富且数据类型多样,存储和分析挖掘的数据量庞大,对数据展现的要求较高,并且很看重数据处理的高效性和可用性. 传统数据处理方法的不足 传统的数据采集来源单一,且存 ...
随机推荐
- Numpy使用大全(python矩阵相关运算大全)-Python数据分析基础2
//2019.07.10python数据分析基础——numpy(数据结构基础) import numpy as np: 1.python数据分析主要的功能实现模块包含以下六个方面:(1)numpy—— ...
- Java 日期与时间
章节 Java 基础 Java 简介 Java 环境搭建 Java 基本语法 Java 注释 Java 变量 Java 数据类型 Java 字符串 Java 类型转换 Java 运算符 Java 字符 ...
- Ubuntu1804 双网卡的设置
在WIFI模式下,既可以使用ping开发板,又可上网. 目标:ubuntu1804下使用两个网卡 网卡(eth0):用于桥接主机的物理网卡 网卡(eth1):用于NAT模式下共享主机IP,用于 ...
- 标准C的标记化结构初始化语法
1 struct file_operations { 2 struct module *owner; 3 loff_t (*llseek) (struct file * ...
- uniapp 小程序实现自定义底部导航栏(tarbar)
在小程序开发中,默认底部导航栏很难满足实际需求,好在官方给出了自定义形式,效果如下: 话不多说,直接上代码 1.组件 custom-tarbar.vue文件 <template> < ...
- Metasploitable学习(一)
划红线的是执行语句,对已知的服务器的IP地址进行扫描.嗅探
- Docker安装,基本概念,执行流程,生命周期简介
Docker基本概念 在使用Docker前,首先要先知道Docker中这几个常用的概念: 镜像:镜像是文件,只读的,提供了运行完整软硬件应用程序的集装箱. 容器:是镜像的实例,由Docker负责创建, ...
- linux下nginx的安装和配置
准备目录 [root@sqh ~]# mkdir /usr/local/nginx [root@sqh ~]# cd /usr/local/nginx 添加一些支持和依赖 1.安装gcc 安装redi ...
- 常见的四种Essay Reference写作格式大全
Essay包括四个部分——introduction,Main body,conclusion,Reference. 1.Introduction包括Topic的背景介绍和文章主要解决的主要问题,一般是 ...
- 数论 CF27E Number With The Given Amount Of Divisors
求因子数一定的最小数(反素数) #include<iostream> #include<string> #include<cmath> #include<cs ...