iOS 开发高手课
戴铭
前滴滴出行技术专家
42934 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
用户故事 (1讲)
iOS 开发高手课
15
15
1.0x
00:00/00:00
登录|注册

09 | 无侵入的埋点方案如何实现?

实现方法
实现方法
实现方法
事件唯一标识
UIViewController 生命周期的埋点
缺点
优点
缺点
优点
未来的方向
无侵入埋点的难题
特殊情况的处理
通过索引来进行唯一标识
通过视图层级的路径来解决问题
UITableView 控件的埋点
点击事件的埋点
页面进入次数、页面停留时间的埋点
实现和工程代码的解耦
不需要在工程代码中写入埋点代码
无埋点
可视化埋点
代码埋点
课后作业
小结
事件唯一标识
运行时方法替换方式进行埋点
无侵入的埋点方案特点
三种常见的埋点方式
无侵入的埋点方案
无侵入的埋点方案如何实现?

该思维导图由 AI 生成,仅供参考

你好,我是戴铭。
在 iOS 开发中,埋点可以解决两大类问题:一是了解用户使用 App 的行为,二是降低分析线上问题的难度。目前,iOS 开发中常见的埋点方式,主要包括代码埋点、可视化埋点和无埋点这三种。
代码埋点主要就是通过手写代码的方式来埋点,能很精确的在需要埋点的代码处加上埋点的代码,可以很方便地记录当前环境的变量值,方便调试,并跟踪埋点内容,但存在开发工作量大,并且埋点代码到处都是,后期难以维护等问题。
可视化埋点,就是将埋点增加和修改的工作可视化了,提升了增加和维护埋点的体验。
无埋点,并不是不需要埋点,而更确切地说是“全埋点”,而且埋点代码不会出现在业务代码中,容易管理和维护。它的缺点在于,埋点成本高,后期的解析也比较复杂,再加上 view_path 的不确定性。所以,这种方案并不能解决所有的埋点需求,但对于大量通用的埋点需求来说,能够节省大量的开发和维护成本。
在这其中,可视化埋点和无埋点,都属于是无侵入的埋点方案,因为它们都不需要在工程代码中写入埋点代码。所以,采用这样的无侵入埋点方案,既可以做到埋点被统一维护,又可以实现和工程代码的解耦。
接下来,我们就通过今天这篇文章,一起来分析一下无侵入埋点方案的实现问题吧。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

iOS开发中常见的埋点方式包括代码埋点、可视化埋点和无埋点。无侵入的埋点方案通过运行时方法替换技术实现了埋点被统一维护并与工程代码解耦的优势。本文介绍了基于运行时方法替换技术的无侵入埋点实现方法,通过替换UIViewController的生命周期方法和UIButton的点击事件方法,以及对Cocoa框架中的其他控件和手势事件的处理,实现了无侵入的埋点方案。这种方法能够实现页面进入次数、页面停留时间和点击事件的埋点,为iOS开发中的埋点需求提供了一种高效且无侵入的解决方案。 文章还讨论了事件唯一标识的重要性,以及如何通过视图层级路径、索引和特殊情况的处理来确保唯一标识的准确性。同时,文章也指出了无侵入埋点方案的局限性,特别是在视图层级在运行时会被更改或需求迭代页面更新频繁的情况下,唯一标识的准确性难以保障。作者提出了使用Clang AST的接口,在构建时遍历AST,通过定义的规则将所需的埋点代码直接加入的想法,认为这可能会更加合适。 总的来说,本文介绍了无侵入埋点的实现方法及其优势,同时也指出了其局限性和未来可能的改进方向。对于读者来说,本文提供了对iOS开发中埋点需求的一种解决方案,并引发了对于埋点实现方式的思考和讨论。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《iOS 开发高手课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(46)

  • 最新
  • 精选
  • 小前端
    感觉这篇文章适合做原理讲解,实用性不大。实际业务场景中会需要抓取页面id,控件id,控件内容,事件类型,埋点类型(比如曝光还是事件),很复杂的,而这些信息都需要在具体的业务中获取。至少本文这套理论是做不到的。运营和产品也不会按照什么view path来分析结果。

    作者回复: 客户端只能负责采集数据,采集的数据到了服务端,还需要进行功能标注。关于业务数据依赖在服务端做关联,不过标注的内容维护成本依然很大,对于客户端开发人员来说是减轻了工作量,而工作量转接到了维护标注的人那。

    2019-03-30
    2
    43
  • drunkenMouse
    1.为什么不把+load方法移到initalize?既然是单例的话,不用担心子类调用父类的重复调用吧? 2.为什么不建一个基于UIViewController的基类,然后重写ViewWillAppear与ViewDidAppear?只要保证所有的UIViewController都继承这个基类就可以的吧。

    作者回复: 实际工程可以这么做,没有问题的

    2019-03-31
    5
    7
  • Geek_de8948
    一直觉得采用切面编程实现埋点都是理论上,实际是不可行的。 因为如果项目集成bugly这种第三方sdk时,他们也是切面,你埋掉也切,这种相互各种交换方法系统方面,肯定会导致一个失效。 这个问题困扰了很久,不知道老师咋看。 比如我现在项目由于早期就使用了bugly,导致我现在就不敢随意切。

    作者回复: 是的,从发展来看,通过 Clang 打桩可能更适合

    2019-04-01
    4
    6
  • 筇琼
    戴老师,你好,当我有两个类扩展,都通过运行时交换了ViewWillAppear方法,此时会崩溃,请问这个改如何避免,这个崩溃是必然的吗?还是由于我加入扩展的顺序导致的?

    作者回复: 需要避免 hook 冲突

    2019-03-30
    3
    4
  • 家有萌柴fries
    “我倒是觉得使用 Clang AST 的接口,在构建时遍历在构建时遍历 AST,通过定义的规则将所需要的埋点代码直接加”,这个会在之后的文章再具体介绍介绍么?

    作者回复: 会的

    2019-04-02
    2
  • 白浩泉
    戴老师您好,我理解Clang AST类似的插装技术只是解决了hook的问题,在添加埋点代码的时候一样要解决view唯一标识的问题,目前最大的问题就是没法找到一个稳定的view标识 望解答,谢谢!

    作者回复: Clang AST 不是运行时的,静态可以通过代码级逻辑精准控制

    2019-06-20
    1
  • 🐰先生
    给button 或者其他View 埋点的时候,可不可以通过给这个Button设置 Tag值,来达到唯一标识的目的

    作者回复: 关键是 tag 映射说明表的维护成本还是有的

    2019-04-10
    2
    1
  • 怪兽
    有两个问题请教: 1.事件唯一标识:子视图在父视图中的索引怎么获取 2.统计到数据后怎么根据这个事件唯一标识分析数据,大数据分析师怎么知道这个唯一标识是哪个业务按钮或业务事件

    作者回复: 1.subviews 遍历索引 2.在后台标注,可以配合测试过程中上传截图做匹配。

    2019-04-03
    1
  • daniel
    SMLogger怎么实现。。这里没讲吗

    作者回复: 我在答疑4里专门说下

    2019-05-20
  • GODV
    戴老师,后面会有动画讲解吗,比如经典的第三方POP介绍。

    作者回复: 会的

    2019-03-31
收起评论
显示
设置
留言
46
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部