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

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

     1
     35
  • 鹏哥
    2019-04-01
    交换方法的代码有的说放在load方法,有的说放在load方法里面影响了启动速度,应该移到initalize方法中,所以,老师,你怎么看的?
     1
     15
  • 张蒙
    2019-03-30
    利用Aspects,实现面向横切编程,在加上资源增量更新可以实现动态无痕埋点。
    
     13
  • Damon
    2019-05-14
    hook最好放在load中而不是InInitialize中,是跟调用的机制有关系,同时类别中实现了InInitialize会覆盖本类的InInitialize方法,有些场景不适用(比如本类和类别都做了方法hook),而load则能满足这种场景,所以最好在load中做hook,也可以根据业务场景选择是在load还是在InInitialize中hook
    
     6
  • Geek_d4991f
    2019-04-03
    建议可以读下mixpanel,基本市面上的全埋点、无埋点都是基于此方案的优化,不过mixpanel的hook存在递归无法退出问题,需要优化
    
     6
  • drunkenMouse
    2019-03-31
    1.为什么不把+load方法移到initalize?既然是单例的话,不用担心子类调用父类的重复调用吧?
    2.为什么不建一个基于UIViewController的基类,然后重写ViewWillAppear与ViewDidAppear?只要保证所有的UIViewController都继承这个基类就可以的吧。

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

    
     6
  • ssala
    2019-04-02
    埋点如果要携带业务数据的话,本身就是一件很复杂很特化的问题了,除了手动埋点以外没有更好的方式,硬是把无埋点这套逻辑往上套的话,除了徒增复杂度以外,没什么好处。
    
     4
  • Geek_de8948
    2019-04-01
    一直觉得采用切面编程实现埋点都是理论上,实际是不可行的。
    因为如果项目集成bugly这种第三方sdk时,他们也是切面,你埋掉也切,这种相互各种交换方法系统方面,肯定会导致一个失效。
    这个问题困扰了很久,不知道老师咋看。
    比如我现在项目由于早期就使用了bugly,导致我现在就不敢随意切。

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

     1
     3
  • Geek_53637b
    2019-03-31
    实际埋点需求中,埋点往往和业务数据强相关,比如点击页面上的加车按钮,埋点上报的数据中需要有商品id,当前商品的促销类型,商家id等等,这类需求暂时没有很好的无痕埋点方案
    
     2
  • 筇琼
    2019-03-30
    戴老师,你好,当我有两个类扩展,都通过运行时交换了ViewWillAppear方法,此时会崩溃,请问这个改如何避免,这个崩溃是必然的吗?还是由于我加入扩展的顺序导致的?

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

    
     2
  • Kim
    2019-06-06
    我的实现方案

    ```
    @implementation UITableView (SMHook)
    + (void)load {
        SEL fromSelector = @selector(setDelegate:);
        SEL toSelector = @selector(sm_toDelegate:);
        
        [SMHook hookClass:self fromSelector:fromSelector toSelector:toSelector];
    }

    - (void)sm_toDelegate:(id <UITableViewDelegate>)delegate {
        [self sm_toDelegate:delegate];
        // 得到代理对象,代理对象会调用代理方法
        SEL fromSelector = @selector(tableView:didSelectRowAtIndexPath:);
        SEL toSelector = @selector(sm_tableView:didSelectRowAtIndexPath:);
        
        // 得到被替换的类的实例方式
        Method fromMethod = class_getInstanceMethod(delegate.class, fromSelector);
        // 得到替换的类的实例方法
        Method toMethod = class_getInstanceMethod(self.class, toSelector);
        
        // class_addMethod 添加要替换的方法
        class_addMethod(delegate.class, toSelector, method_getImplementation(toMethod), method_getTypeEncoding(toMethod));
        Method hookMethod = class_getInstanceMethod(delegate.class, toSelector);
        method_exchangeImplementations(fromMethod, hookMethod);
        
    }

    -(void)sm_tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        NSLog(@"aaa");
        [self sm_tableView:tableView didSelectRowAtIndexPath:indexPath];
    }


    @end
    ```
    展开
    
     1
  • Geek_麟凤来思
    2019-05-14
    老师,能每篇做个demo吗?只说没具体实现,还是不会啊!
     1
     1
  • 🐰先生
    2019-04-10
    给button 或者其他View 埋点的时候,可不可以通过给这个Button设置 Tag值,来达到唯一标识的目的

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

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

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

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

    作者回复: 会的

    
     1
  • 元
    2019-04-01
    编程过程中还是尽量少用runtime,不能作为优先选择的方案,不然工程对程序员的要求会越来越高。
    
     1
  • 追想画廊
    2019-03-31
    课后作业 hook tableView: didSelectRowAtIndexPath:就好了 不过得hook NSObject这种基类
    需要注意的是为了避免其他类出现的同名的方法 还得判断一下 tableView是不是UITableView的子类
    
     1
  • 木昜
    2019-11-15
    老师,问一下,针对tap手势进行作业时,先hook掉initwithtarget方法,然后再交换传递进来的action方法,那么针对vc里面添加了多个Ges对应的action操作,怎么保证action和我们写的swizzle_action是一一对应的…就是ac1对应swizzle_ac1,ac2对应swizzle_ac2,能动态实现吗?根据外界传入不同的action,生成不同的swizzle_ac……求指点
    
    
  • Baan
    2019-09-05
    学到了
    
    
  • Swift_yong
    2019-08-21
    看了好多, Clang 编译层面的东西不会写, 我太难了, 感觉找不到学习这部分的入口一样
    
    
我们在线,来聊聊吧