美文网首页
iOS无埋点数据采集实践

iOS无埋点数据采集实践

作者: flexih | 来源:发表于2019-03-02 22:46 被阅读0次

无埋点又称全埋点或者零埋点,虽然叫法不一样,想要到达的目的是一样的,即数据收集不再需要hard code,甚至可以做到动态可配要收集的数据。这里不讨论无埋点的方案细节,只探讨实践过程中遇到的几个点。目前看到网上的资料里提出的方案还有提升的空间。下面具体分析一下。

1.UITableViewCell的点击事件
UIKIT_EXTERN NSNotificationName const UITableViewSelectionDidChangeNotification;

如通知的名字所示UITableViewCell被选中的时候会发通知,监听此通知即可收集UITableViewCell选中事件。

2. UITableViewCell展现事件

对UIKitCore.framework使用class-dump获得UITableView的方法列表。UIKitCore.framework的路径为/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/UIKitCore.framework/。也可以使用Xcode来dump UITableView,可以得到更详细的信息,推荐使用。首先配置lldb命令,使用命令

dclass -I UITableView

通过搜索willDisplay发现如下三个方法:

-_createPreparedCellForGlobalRow:willDisplay:
-_createPreparedCellForRowAtIndexPath:willDisplay:
-_createPreparedCellForGlobalRow:withIndexPath:willDisplay:

我们分别来看三个方法的实现。这里使用Hopper Disassembler,在Hopper里打开UIKitCore.framework,等分析完毕,搜索 -_createPreparedCellForGlobalRow:willDisplay:并定位,代码如下:


可以发现内部调用了第3个方法。
再看-_createPreparedCellForRowAtIndexPath:willDisplay:的实现:

这里也调用了第3个方法。
最后看-_createPreparedCellForGlobalRow:withIndexPath:willDisplay:的实现:

这个方法的内容较多,截取了一部分。可以看到箭头指向的地方回调了delegate方法-tableView:willDisplayCell:forRowAtIndexPath:。通过Hook这个方法就可以做到监听UITableViewCell的展现。
实现hook方法的时候注意32位和64位时参数的类型不同。
3.UICollectionView的点击和展现

把上面的方法应用到UICollectionView即可以找到对应方法。

-_notifyWillDisplayCellIfNeeded:forIndexPath:
-_selectItemAtIndexPath:animated:scrollPosition:notifyDelegate:
4. UIControl点击事件
@interface UIApplication
- (BOOL)sendAction:(SEL)action to:(nullable id)target from:(nullable id)sender forEvent:(nullable UIEvent *)event;

Hook UIApplication的方法sendAction:to:from:forEvent:即可。

5.UITapGesture, UILongPressGesture
@interface UIApplication
- (void)sendEvent:(UIEvent *)event;

这个方法会分发app里的UI事件,需要先把UIControl的事件过滤掉。然后先处理Gesture事件。在UITouchPhaseBegan的时候记录下touch里的可能相应的gesture,在UITouchPhaseEnded时找到状态为UIGestureRecognizerStatePossible的gesture,即为触发的gesture。在记录gesture的时候同时监听gesture的state,UILongPressGesture触发时,state变为UIGestureRecognizerStatePossible。

bool Click::handleGesture(UITouch *touch) {
  if (touch.phase == UITouchPhaseBegan) {
    bool handled = false;
    for (UIGestureRecognizer *obj in touch.gestureRecognizers) {
      if (obj.enabled) {
        observeGesture(obj);
        handled = true;
      }
    }
    return handled;
  } else if (touch.phase == UITouchPhaseCancelled) {
    if (observedGestures.count == 0) return false;
    for (UIGestureRecognizer *g in observedGestures) {
      objc_setAssociatedObject(g, kGestureObserverKey, nil, OBJC_ASSOCIATION_RETAIN);
    };
    [observedGestures removeAllObjects];
    return true;
  } else {
    return observedGestures.count > 0;
  }
}
bool Click::handleObserve(NSString *keyPath, NSObject *object, NSDictionary *change, void *context) {
  if ([keyPath isEqualToString:@"state"]) {
    if (IS(UIGestureRecognizer, object)) {
     auto gesture = (UIGestureRecognizer*)object;
     auto state = [(UIGestureRecognizer *)object state];
     auto handled = false;
     if (state == UIGestureRecognizerStateEnded || state == UIGestureRecognizerStateFailed) {
          if (state == UIGestureRecognizerStateEnded) {
            handled = true;
          }
          objc_setAssociatedObject(object, kGestureObserverKey, nil, OBJC_ASSOCIATION_RETAIN);
        }
        [observedGestures removeObject:object];
      }
      return handled;
    }
  }
  return false;
}
6.UIView的touches事件

以上排除手势事件外的即认为是UIView的touches事件,如果是UIView的子类也可以结合是否重写了父类的touches方法综合判断。

相关文章

  • iOS无埋点数据SDK的整体设计与技术实现

    iOS无埋点数据 SDK 实践之路 iOS无埋点SDK 之 RN页面的数据收集 本篇文章是讲述 iOS 无埋点数...

  • iOS无埋点数据采集实践

    无埋点又称全埋点或者零埋点,虽然叫法不一样,想要到达的目的是一样的,即数据收集不再需要hard code,甚至可以...

  • 面向过程/对象/切面编程

    面向过程编程,面向对象编程和面向切面编程理解 iOS无埋点数据 SDK 实践之路iOS无埋点SDK 之 RN页面的...

  • [GrowingIO]Spark在GrowingIO数据无埋点全

    【一点资讯】Spark在GrowingIO数据无埋点全量采集场景下的实践 www.yidianzixun.comh...

  • 揭秘数极客Android无埋点数据采集原理

    数据采集基本可分为代码埋点和无埋点。近年来无埋点的数据采集方案越来越普及,而无埋点的实现方案也有多种,我们今天讨论...

  • 数据运营(6)数据采集

    数据采集的重要性不言而喻。 一、数据采集方案 目前有三种常见的数据采集方案,分别是埋点、可视化埋点、无埋点。 1....

  • iOS开发见闻-第21期

    欢迎加QQ群讨论:157672725 文章 1.iOS无埋点数据SDK实践之路 : 本篇文章是基于 网易乐得无埋点...

  • Android无埋点的技术选型之路

    数极客是国内新一代用户行为分析平台,支持无埋点采集,前端代码埋点采集,后端代码埋点采集等多种混合数据采集方式,支持...

  • 数据埋点和指标字典

    数据埋点 数据埋点是一种常用的数据采集方法,埋点是数据的来源,采集数据以帮助业务人员分析网站或者app的使用...

  • Android全埋点

    什么是全埋点? 也叫做无埋点,预先收集用户的所有行为数据,然后根据实际需求,从中提取行为数据。 采集数据的点: $...

网友评论

      本文标题:iOS无埋点数据采集实践

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