iOS无侵入的埋点计划怎么完成?

云栖号资讯:【点击检查更多职业资讯】
在这儿您能够找到不同职业的第一手的上云资讯,还在等什么,快来!


在开发过程中,埋点能够处理两大类问题:一是了解用户运用 App 的行为,二是下降剖析线上问题的难度。现在,iOS 开发中常见的埋点办法,首要包含:

  • 代码埋点
  • 可视化埋点
  • 无埋点

代码埋点

代码埋点首要便是经过手写代码的办法来埋点,能很精确的在需求埋点的代码处加上埋点的代码,能够很便利地记载当时环境的变量值,便利调试,并盯梢埋点内容,但存在开发作业量大,并且埋点代码处处都是,后期难以保护等问题。

缺陷:

  1. 清楚明了,你会在后期保护的时分写的置疑人生
  2. 复用性差,简直不能移植给其他项目
  3. 作业量大,并且会越写越多
  4. 计算代码上线之后,假如出现问题,只能后续版别迭代
  5. 假如计算项目姓名改变了,本来老的APP版别依旧会计算老的页面姓名

长处:

  1. 假如非要写一个其他计算无法做到的长处的话,那便是可自界说程度高吧,计算代码想写到那里写到那里(其实这些也能够在后面的计划完结,只是完结上略微费事一点算了)
  2. 最简略想到的计划(前期费时少,运用起来费手不费思路)

可视化埋点

便是将埋点添加和修正的作业可视化了,提升了添加和保护埋点的体会。

该计划的详细步骤便是:

  1. 从后台获取需求计算的当地
  2. hook住需求计算的类的load办法来Method Swizzing要计算的办法
  3. 上传计算到的工作给后台剖析

用UIViewController、UIControl为比方,解说一下该计划的思路。

UIViewController PV计算,页面的计算较为简略,运用Method Swizzing hook 体系的viewDidLoad, 直接经过页面称号即可确认页面的展现代码如下:

iOS无侵入的埋点计划怎么完成?

UIControl 点击计算,首要经过hook sendAction:to:forEvent: 来完结, 其仅有标识符咱们用 targetname/selector/tag来符号,详细代码如下:

iOS无侵入的埋点计划怎么完成?

缺陷:

  1. 需求后台合作
  2. 可拓展性不是很高,由于需求修正后台下发的计算内容来做每次的版别计算扩展

长处:

  1. 相关于第一种计划,代码量少了许多。
  2. 动态化从后台获取计算内容,便利线上修正

无埋点

无埋点,并不是不需求埋点,而更切当地说是“全埋点”,并且埋点代码不会出现在事务代码中,简略办理和保护。它的缺陷在于,埋点本钱高,后期的解析也比较杂乱,再加上 view_path 的不确认性。所以,这种计划并不能处理一切的埋点需求,但关于很多通用的埋点需求来说,能够节约很多的开发和保护本钱。

在这其间,可视化埋点和无埋点,都属所以无侵入的埋点计划,由于它们都不需求在工程代码中写入埋点代码。所以,选用这样的无侵入埋点计划,既能够做到埋点被一致保护,又能够完结和工程代码的解耦。

接下来,咱们就经过今日这篇文章,一起来剖析一下无侵入埋点计划的完结问题吧。

运行时办法替换办法进行埋点

咱们都知道,在 iOS 开发中最常见的三种埋点,便是对页面进入次数、页面停留时刻、点击工作的埋点。关于这三种常见状况,咱们都能够经过运行时办法替换技能来刺进埋点代码,以完结无侵入的埋点办法。详细的完结办法是:先写一个运行时办法替换的类 ViewHook,加上替换的办法 hookClass:fromSelector:toSelector,代码如下:

iOS无侵入的埋点计划怎么完成?

这个办法运用运行时method_exchangeImplementations 接口将办法的完结进行了交流,原办法调用时就会被hook 住,从而去履行指定的办法。

页面进入次数、页面停留时刻都需求对 UIViewController 生命周期进行埋点,你能够创立一个 UIViewController 的 Category,代码如下:

iOS无侵入的埋点计划怎么完成?
iOS无侵入的埋点计划怎么完成?

能够看到,Category 在+load() 办法里运用了 ViewHook 进行办法替换,在替换的办法里履行需求埋点的办法 [self insertToViewWillAppear]。 这样的话,每个UIViewController生命周期到了ViewWillAppear 时都会去履行insertToViewWillAppear 办法。

那么,咱们要怎样差异不同的 UIViewController 呢?我一般采纳的做法都是,运用NSStringFromClass([self class]) 办法来取类名。这样,我就能够经过类名来差异不同的 UIViewController 了。

关于点击工作来说,咱们也能够经过运行时办法替换的办法进行无侵入埋点。这儿最首要的作业是,找到这个点击工作的办法 sendAction:to:forEvent:,然后在 +load() 办法运用 ViewHook 替换成为你界说的办法。完好代码完结如下:

iOS无侵入的埋点计划怎么完成?

和 UIViewController 生命周期埋点不同的是,UIButton 在一个视图类中或许有多个不同的承继类,相同 UIButton 的子类在不同视图类的埋点也要差异开。所以,咱们需求经过 “action 挑选器名NSStringFromSelector(action)” +“视图类名 NSStringFromClass([target class])”组合成一个仅有的标识,来进行埋点记载。

除了 UIViewController、UIButton 控件以外,Cocoa 结构的其他控件都能够运用这种办法来进行无侵入埋点。以 Cocoa 结构中最杂乱的 UITableView 控件为例,你能够运用 hook setDelegate 办法来完结无侵入埋点。别的,关于 Cocoa 结构中的手势工作(Gesture Event),咱们也能够经过 hook initWithTarget:action: 办法来完结无侵入埋点。

工作仅有标识

经过运行时办法替换的办法,咱们能够 hook 住一切的 Objective-C 办法,能够说是大而全了,能够协助咱们处理绝大部分的埋点问题。

可是,这种计划的精确度还不够高,还无法差异相同类在不同视图树节点的状况。比方,一个视图下相同 UIButton 的不同实例,只是经过 “action 挑选器名”+“视图类名”的组合还不行以差异开。这时,咱们就需求有一个仅有标识来差异不同的工作。接下来,我就跟你说说怎么拟定出这个仅有标识。

这时,我首要想到的便是,能不能经过视图层级的途径来处理这个问题。由于每个页面都有一个视图树结构,经过视图的 superview 和 subviews 的特点,咱们就能够复原出每个页面的视图树。视图树的顶层是 UIWindow,每个视图都在树的子节点上。如下图所示:

iOS无侵入的埋点计划怎么完成?

一个视图下的子节点或许是同一个视图的不同实例,比方上图中 UIView 视图节点下的两个 UIButton 是同一个类的不同实例,所以光靠视图树的途径仍是无法仅有确认出视图的标识。那么,这种状况下,咱们又应该怎么差异不同的视图呢?

这时,咱们想到了索引:每个子视图在父视图中都会有自己的索引,所以假如咱们再加上这个索引的话,每个视图的标识便是仅有的了。

接下来的一个问题是,视图层级途径加上在父视图中的索引来进行仅有标识,是不是就能够包括一切状况了呢?

当然不是。咱们还需求考虑相似 UITableViewCell 这种具有可复用机制的视图,Cell 会在页面翻滚时不断复用,所以加索引的办法仍是无法用。

但这个问题也并不是无解的。UITableViewCell 需求运用 indexPath,这个值里包含了 section 和 row 的值。所以,咱们能够经过 indexPath 来确认每个 Cell 的仅有性。

除了 UITableViewCell 这种状况之外, UIAlertController 也比较特别。它的特别性在于视图层级的不固定,由于它或许出现在任何页面中。可是,咱们都知道它的功用差异往往经过弹窗内容来决议,所以能够经过内容来确认它的仅有标识。

除此之外,还有更多需求特别处理的状况,但咱们总是能够经过一些办法去确认它们的仅有性,所以我在这儿也就不再一一列举了。思路上来说便是,想办法找出元素间不相同的要素然后进行组合,最终构成一个能够差异于其他元素的标识来。

除了上面说到的这些特别状况外,还有一种状况使得咱们也难以得到精确的仅有标识。假如视图层级在运行时会被更改,比方履行 insertSubView:atIndex:、removeFromSuperView 等办法时,咱们也无法得到仅有标识,即便只截取部分途径也无法确保后期代码更新时不会动到这个部分。就算是运行时视图层级不会修正,今后需求迭代页面更新频频的话,视图仅有标识也需求同步的更新保护。

这种问题就欠好处理了,工作仅有标识的精确性难以保证,这也是经过运行时办法替换进行无侵入埋点很难在各个公司全面铺开的原因。尽管无侵入埋点无法掩盖到一切状况,全面铺开面对应战,可是无侵入埋点仍是处理了大部分的埋点需求,也节约了很多的人力本钱。

最好的计划永远是针关于不同的场景来说的,咱们不或许在一个创业团队一开端就挑选计划3的架构,所以关于你来说,你要自己挑选现在而言对你最好的计划,假如你没有后台事务同学的支撑,计划1或许对你来说真的是最好的计划了,最少是能够完结计算需求,尽管苦点累点。可是在适宜的时刻,切换不同的挑选,才是生长的表现,仍是最开端的话,假如你在的团队,现已给你了资源和时刻去完善埋点这个模块,假如你把它做的更好,那一定是一件很帅的工作。

【云栖号在线讲堂】每天都有产品技能专家共享!
课程地址:https://yqh.aliyun.com/live

当即参加社群,与专家面对面,及时了解课程最新动态!
【云栖号在线讲堂 社群】https://c.tb.cn/F3.Z8gvnK

原文发布时刻:2020-04-30
本文作者:kvoxxx
本文来自:“cocoachina”,了解相关信息能够重视“cocoachina”