可视化无痕埋点

1、可视化无痕埋点:

简介:不需要代码埋点,通过可视化界面圈选埋点范围,通过自定义脚本语言抓取业务字段生成埋点的方案

目的:为解决普通埋点与业务代码耦合,漏埋错埋问题

内容:包含线下圈选埋点SDK、线上用户埋点SDK,WEB管理平台,埋点后台

技术点:ui事件的拦截,控件唯一id,业务字段抓取规则解析,埋点的存储上传,配置文件的版本控制等

2、示例:产品购买按钮埋点步骤

(1)线下开启APP圈选功能,点击购买按钮,生成一条埋点配置信息,并与安卓端匹配;

(2)web配置平台编辑配置该信息,添加附加字段抓取规则;

(3)线上app启动时服务器下发对应版本的埋点配置文件,用户点击该按钮时拦截UI事件,根据生成唯一id在配置文件中做匹配;

(4)获取该按钮的配置文件中的业务字段规则,在当前环境下抓取数据,生成埋点存储上传;

3、事件拦截:runtime的方法交换做事件拦截

页面:拦截willappear和disappear,注意进前台后台crash等引起的不匹配,时间戳校正     

事件分为button点击cell点击手势点击等,拦截要获取到三个元素:控件,target,action

Button:拦截UIControl的sendAction:to:forEvent

Cell:

1、拦截UITableView的setDelegate:获取delegate对象

2、再拦截delegate的didSelectRowAtIndexPath:方法获取cell

Gesture:

1、拦截UIGestureRecognizer的addtarget:action:和initWithTarget:action:方法得到target和action;

2、拦截target的action:根据action的参数gesture.view获取控件;

3、若action无参,先动态添加一个有参的action:与原方法互换,当用户点击时会调用有参的action:再执行步骤2

实现方案2:NSProxy做消息转发

1、拦截UITableView的setDelegate:获取到delegate对象 

2、创建一个NSProxy对象作为delegate对象的代理对象

3、在NSProxy对象中做消息转发,针对tableView:didSelectRowAtIndexPath:方法插入埋点代码

4、控件唯一id规则:

唯一ID规则:当前响应View的ViewPath(只有最后一层携带子view的index,其他均为类名)$事件的target类名$事件的SEL名称$tag值

示例:vc/view[0]/view[0]/button#target#selector#tag

AQJHomeVC/UIImageView/UIView[1]/UIButton#AQJHomeVC#clickShareAction#3

服务器下发的配置文件,嵌套字典

{

    "HomeViewController":{

        "控件id的MD5":{

            "em附加字段抓取规则":[

                {

                    "fn附加字段key":"userId",

                    "fnEl附加抓取规则":"userDefault.userId"

                },{

                    "fn":"pId",

                    "fnEl":"selfVC.viewModel.pModel.pId"

                }

                ]

        }

    },

    “MyViewController”:{},

}

5、附加字段:

埋点携带的信息分为三类:不可变通用信息,可变通用信息,特定业务信息

不可变通用信息(设备信息、版本信息等)APP启动时上传一次  

可变通用信息(用户登录id、当前网络状况、发生时间)埋点发生时获取

特定业务信息(点击购买按钮时保险id等)根据附加字段抓取规则在当前环境获取

从配置文件中匹配到抓取规则如:selfVC.viewModel.pModel.pId

先分割字符串,根据响应链获取控件所在VC,通过KVC获取属性值

附加字段抓取规则解析

获取附加字段:字段抓取规则 +上下文环境 + 规则解析算法

规则示例:

userDefault.userId

selfVC.viewModel.productList[indexPath.row].pModel.pId

事件拦截时能够得到的环境上下文:

点击的控件、控件所在VC、存储app信息的各种单利、(当前点击cell的indexPath)

规则元素&上下文变量映射

self                   控件本身

selfVC              控件所在控制器

indexPath       点击的cell所在位置

userDefault     用户信息单利

client               手机设备信息单利

解析算法:

案例1:selfVC.viewModel.title,直接通过KVC获取

案例2:selfVC.viewModel.productList[indexPath.row].pModel.pId,先解析[]得到数值,取数组中的model,KVC获取pId

案例3:selfVC.viewModel.productList[(indexPath.row+2)*3+5].pModel.pId

使用队列将(indexPath.row +2)*3+5转换成中缀表达式(4+2)*3+5,转成后缀表达式,计算表达式结果,按方案2取值

6、圈选SDK:

打开圈选模式,遍历页面中可点击控件,画边框标注

选择要圈选的控件,填写备注信息,与安卓端进行匹配,生成一条埋点配置文件

7、埋点存储上传:

采用SQLite存储+GCD同步队列

埋点产生后先入库后根据策略上传

表结构:埋点数据转成二进制data,主键自增id;分为正常数据埋点和时时数据埋点两张表,表的插入读取删除使用同步列队

上传时机分为重要埋点实时上传、普通埋点满30条上传、APP启动、前后台切换超过30秒上传,上传成功之后删除表中数据

8、配置文件版本管理:

按APP版本号管理埋点配置信息

每次APP更新版本,后端需要从旧版本复制一份配置文件到新版本

APP提供失效埋点检测功能,可重新圈选来更正变更埋点信息

新增功能进行埋点圈选

9、不足之处:

附加字段不支持复杂规则、业务字段规则需了解代码、用户SDK使用了事件拦截和算法费性能

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,888评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,677评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,386评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,726评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,729评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,337评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,902评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,807评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,349评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,439评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,567评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,242评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,933评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,420评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,531评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,995评论 3 377
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,585评论 2 359

推荐阅读更多精彩内容

  • 代码地址:https://github.com/geminate/vue-visual-track由于埋点需求灵活...
    Madokami阅读 4,724评论 0 2
  • 1、背景 稀里哗啦一大段 2、主要功能划分 从整个流程来说,我把他划分为下面几个主要的功能,事件拦截、viewPa...
    林风098阅读 1,000评论 2 7
  • 前言 最近跟同事花了点时间来思考可视化埋点,并没有什么突破性的进展,不过市面上很多关于可视化埋点的技术文章都在讲达...
    daixunry阅读 8,039评论 1 38
  • https://mp.weixin.qq.com/s/u-HmmrSAgtER1N2pKxCm0A 随着公司业务的...
    海浪萌物阅读 3,076评论 1 1
  • iOS 最优无痕埋点方案 在移动互联网时代,对于每个公司、企业来说,用户的行为数据非常重要。重要到什么程度,用户在...
    iOS发呆君阅读 6,708评论 3 30