美文网首页
iOS无埋点的理解

iOS无埋点的理解

作者: 王大吉Rock | 来源:发表于2018-11-25 00:36 被阅读128次

    因为公司未来可能会做相关的业务,所以特来提前了解下行情。

    无埋点的理解

    一些知名的做无埋点的企业:
    诸葛IO、talkingData、百分点、百度。

    无埋点具体要实现的功能:

    1. 和原代码耦合,埋点不侵入原代码,无埋点不是不写代码,而是尽可能的减少代码量。。
    2. 通过对界面的圈选,由后台配置埋点,实时下发配置至APP,后台接受到相应埋点数据。

    移动统计包含四大类近50个数据指标,熟悉平台的指标与维度定义是熟练运用移动统计进行数据分析的重要基础。

    相关的知识点

    响应者对象、第一响应者对象、响应者链、事件处理

    响应者对象:所有的响应者对象都是集成了UIResponder的类,这些类声明了事件处理的接口和一些默认的行为,在iOS中UIView、UIControl、UIApplication都是响应者对象。

    第一响应者对象:最先接受到多种事件的响应者对象被称为第一响应者对象,第一响应者对象是APP认为最适合处理事件的视图。

    响应者链:如果一个响应者不处理事件,这个响应者就会把事件传递给下一个 “next responder” ,这样形成的链称为响应者链。在响应者链中如果不能执行事件,就会把事件传递给下一个响应者,到达链的最顶层UIApplication,直到事件被处理,如果事件没有被处理,就被APP丢弃。在iOS中,多了一步操作,如果一个view不能相应这个事件,那么这个view对应的controller就是next responder。

    官方的解释:传送门

    可以根据触发的事件流,来得到事件唯一id。

    view hierarchy、 layer tree

    两个概念:视图树和图层树。分别是由UIView类和CALayer类组成的树状结构。

    两者之间的关系、联系、区别:

    1. 每个UIView实例view都包含了一个CALayer实例,官方称backing layer,view负责backing layer的创建和管理以确保在view在添加和移除子控件的时候可以并行的在图层中进行添加和删除相应的Layer,这样view tree 和 layer tree保持着同样的图层结构。

    2. 实际上这些backing layer才是负责绘制和执行动画的,UIView只是一个wraper,提供了触摸事件、动画效果等接口。

    为啥那么麻烦要整两个图层出来?

    Why does iOS have these two parallel hierarchies based on UIView and CALayer?Why not a single hierarchy that handles everything? 
    
    The reason is to separate responsibilities, and so avoid duplicating code. 
    Events and user interaction work quite differently on iOS than they do on Mac OS; a user interface based on multiple concurrent finger touches (multitouch) is a fundamentally different paradigm to a mouse and keyboard, which is why iOS has UIKit and UIView and Mac OS has AppKit and NSView. They are functionally similar, but differ significantly in the implementation.
    

    意思是说:为了功能的划分,避免出现重复的代码。绘制是layer操作,事件的处理由view完成,虽然功能看似一样,但是其内部实现是不一样的。

    1. 其实这样的层次不是两个而是四个,除了view hierarchylayer tree,还有presentation treerender tree ,额,先在这里不做赘述了吧。

    统计当前界面的所有控件,根据控件或者Layer的各种属性(frame、color、text、button的属性等),并通过特定算法,生成控件唯一id。

    AOP思想

    1. AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。来自百度百科

    2. 在iOS中要运用AOP技术,那需要在运行时,使用Method Swizzling黑魔法来hook需要修改的方法,来动态地修改、替换、改进系统的方法。

    3. 在iOS中,简单通过 Method Swizzling 来 Hook方法不是不可以,滥用也会带来各种各样的隐患。在这里安利一个非常的棒的oc库叫Aspects,安全高效做方法交换。

    一个实际的应用:

    在之前的一个swift项目中,需要将所有带有占位字的输入框,添加类似网页版谷歌邮箱登录动画效果。(textfield在输入时,将占位字上移缩小;输入框没有输入,占位字将还原到原位置,否则将不还原)。

    最先使用全局监听UITextField行为的方式,监听UITextField的开始输入结束输入通知,并判断UITextField对象的是否存在;为了应对_placeholderLable属性的frame没有办法完全控制的问题和产品狗的奇葩需求,我们抛弃了系统提供的_placeholderLable,而是添加了UILable对象mw_placeholderLable的关联属性,并通过method swizzling来交换UITextField的placeholder属性。

    当触发交换方法时,就创建mw_placeholderLable的属性,同时监听.editingDidBegin和.editingDidEnd选项,执行mw_placeholderLable动画。

    // 交换UITextField的placeholder属性
    guard let m1 = class_getInstanceMethod(self, #selector(setter: placeholder)) else {
        return
    }
    guard let temp = class_getInstanceMethod(self, #selector(setInit(_:))) else {
        return
    }
    method_exchangeImplementations(m1, temp)
    

    一个问题,当其他小伙伴接手这项目时,他就会脑瓜疼了。因为交换方法和原代码是耦合的,所以可能无法立马找到问题。

    最后,项目中也添加了取消方法交换的功能,不需要使用动画时就调用此方法,额,就提高了代码的灵活性。

    mmap 一种内存映射文件的方法

    前提:iOS操作系统是基于Darwin(BSD)的类Unix系统的,是一个符合一个符合POSIX标准的Unix 系统。

    引用: mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享。

    首先需要简单理解下文件读写基本流程,APP在进行文件的磁盘读写操作,是需要通过系统调用用户空间切换至内核空间,操作完成后从内核空间回到用户空间,再进行用户代码。所以从磁盘的写入或读取,都是影响效率的操作,频繁的操作那就会影响应用的整体性能。

    通俗的说就把磁盘上的文件映射到虚拟内存中,中间只进行映射不进行拷贝的操作,避免了文件写入的数据拷贝操作,针对内存的操作相当于是磁盘上文件的操作。其效率跟内存的读写效率是差不多的。

    从数据采集到上传到服务器的过程可能会受到很多因素的影响,比如tracking数据在网络请求中(请求没有完成),程序crash或被杀死时,如果数据没有保存到磁盘上,这会导致数据的丢失。而mmap在进程crash时,映射在内存中的数据会自动写回到磁盘,这样就可以保证数据的不丢失。

    参考

    APP 无埋点流程
    https://juejin.im/entry/58f6d903570c3500564fcf31

    百度统计指标说明 https://mtj.baidu.com/static/userguide/book/contents/indexsystem.html

    iOS Core Animation: The Layer Tree
    http://www.informit.com/articles/article.aspx?p=2128062

    认真分析mmap:是什么 为什么 怎么用
    https://www.cnblogs.com/huxiao-tee/p/4660352.html

    微信高性能线上日志系统xlog剖析
    https://satanwoo.github.io/2017/07/30/xlog/

    相关文章

      网友评论

          本文标题:iOS无埋点的理解

          本文链接:https://www.haomeiwen.com/subject/kguuqqtx.html