![b783059557d3fd8a940802c80f96b5bb.png](https://i-blog.csdnimg.cn/blog_migrate/1ded084b7d93bf30a79c9ff5818b3310.jpeg)
1、原理概述
本章主要介绍页面浏览事件($AppViewScreen)全埋点 的实现原理。在介绍具体的实现原理之前,我们先介绍 UIViewController 生命周期相关的内容,然后再介绍 iOS 的“黑魔法”Method Swizzling。
(1)UIViewController 生命周期
众所周知,每一个 UIViewController 都管理着一个由多 个视图组成的树形结构,其中根视图保存在 UIViewCon- troller 的 view 属性中。UIViewController 会懒加载它所 管理的视图集,直到第一次访问 view 属性时,才会去加 载或者创建 UIViewController 的视图集。
有以下几种常用的方式加载或者创建 UIViewController 的视图集:
•使用 Storyboard
•使用 Nib 文件
•使用代码,即重写 - loadView
以上这些方法,最终都会创建出合适的根视图并保存在
UIViewController 的 view 属性中,这是 UIViewControl-
ler 生命周期的第一步。当 UIViewController 的根视图需
要展示在页面上时,会调用 - viewDidLoad 方法。在这个
方法中,我们可以做一些对象初始化相关的工作。
需要注意的是:此时,视图的 bounds 还没有确定。对于使用代码创建视图,- viewDidLoad 方法会在 -loadView 方法调用结束之后运行;如果使用的是 Stroyboard 或者 Nib 文 件 创 建 视 图,- viewDidLoad 方 法 则 会 在 - awakeFromNib 方法之后调用。
当 UIViewController 的视图在屏幕上的显示状态发生变 化时,UIViewController 会自动回调一些方法,确保子类 能够响应到这些变化。如下图所示,它展示了 UIViewController 在不同的显示状态时会回调不同的方法。
![aa62dccddfb792b95c7dde1ab88557cd.png](https://i-blog.csdnimg.cn/blog_migrate/299819a91c9bfa8c8991e1cb47a2f6e5.jpeg)
图 UIViewController 不同状态的方法调用
在 UIViewController 被销毁之前,还会回调 - dealloc 方 法,我们一般通过重写这个方法来主动释放不能被 ARC 自动释放的资源。
我们现在对UIViewController的整个生命周期有了一些基本了解。那么,我们如何去实现页面浏览事件 ( $AppViewScreen 事件)的全埋点呢?
通过 UIViewController 的生命周期可知,当执行到
- viewDidAppear: 方法时,表示视图已经在屏幕上渲染 完成,也即页面已经显示出来了,正等待用户进行下一步 操作。因此,- viewDidAppear: 方法就是我们触发页面浏览事件的最佳时机。如果想要实现页面浏览事件的全埋点, 需要使用 iOS 的“黑魔法”Method Swizzling 相关的技术。
关于 iOS 应用程序状态更详细的内容,及 iOS 更多内容,可点击下方白皮书了解
《iOS 全埋点技术白皮书》 | 神策图书馆 | 神策数据www.sensorsdata.cn![b53b901038691ca9c015be73678e05fc.png](https://i-blog.csdnimg.cn/blog_migrate/a7a2ef035854ded3fba72fb704705d78.png)