一、埋点的作用:

应用趋势分析:清晰展现应用的新增用户、活跃用户、启动次数、版本分布、行业指标等数据,方便从整体掌控应用的运营情况及增长动态。

渠道分析:在哪里推广最有效?从哪里获取的用户最有价值?通过数据对比评估不同渠道的用户质量和活跃程度,从而衡量推广效果。

留存分析:可以掌握每日(周/月)的新增用户在初次使用后一段时间内的留存率,留存率的高低一定程度上反映了产品和用户质量的好坏。

用户属性:用户的基本属性和行为特征,全面了解用户。

行为分析:针对性地进行应用内的数据统计,了解用户的产品使用细节及行为特征,帮助团队寻找产品改进的突破点,评估产品优化的效果。

二、自动化埋点SDK的研发背景

1、代码埋点

优点:灵活性高,能满足大量个性化需求。

缺点:开发者需要手动在需要埋点的节点植入埋点代码,可能埋点代码也需要植入一定的业务逻辑。

​ 代码耦合严重,复用性差,工作量大,难以维护。

2、自动化埋点

优点:

可以较大程度降低开发成本,不受版本更新影响 。

解耦业务代码,易维护,可移植性强。

解决了数据回溯问题,可查看历史数据。

避免了使用三方SDK可能造成用户关键数据丢失及企业泄密等问题。

缺点:未解决个性化自定义获取数据的问题,缺乏数据获取的灵活性。

三、数据采集

数据采集原理:利用object-c的runtime机制,对有需要的类和事件进行方法交换,进行事件拦截,注入埋点代码,实现数据统计的功能,具体做法是:

重载类的+(void)load方法,在进程加载到内存时利用runtime的method_exchangeImplementations等接口,

将方法(设为M)的实现互相交换,当方法M被调用时就会被Hook,执行我们的方法。

1234567891011

/// ClickKit 类+ (void)swapMethod:(Class)class origMethod:(SEL)origSelector newMethod:(SEL)newSelector{

Method originalMethod = class_getInstanceMethod(class, origSelector);

Method swizzledMethod = class_getInstanceMethod(class, newSelector);

method_exchangeImplementations(originalMethod, swizzledMethod);

}

+ (BOOL)addMethod:(Class)class sel:(SEL)sel method:(IMP)method

{

return class_addMethod(class, sel, method, "v@:@@");

}

(1)页面统计(PV)

PV统计原理:通过hook UIViewController的以下函数,达到采集类名等功能:

特别注意:必须实现以下三个函数的super调用,否则,页面自动化埋点无法触发

123

- (void)viewDidLoad;

- (void)viewDidAppear:(BOOL)animated;

- (void)viewDidDisappear:(BOOL)animated;

(2)事件统计(event)

事件id:通过对点击事件进行方法拦截,获取当前点击控件及控件所属target,根据点击视图的响应者链,逐级取到控件的所属view tree,建议点击视图增加tag。

针对单一点击事件,以UIControl为例:

1234567891011121314151617181920

@implementation UIControl (ClickKit)

+ (void)load

{

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

[ClickKit swapMethod:[self class]

origMethod:@selector(sendAction:to:forEvent:)

newMethod:@selector(swizzle_sendAction:to:forEvent:)];

});

}

- (void)swizzle_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event

{

[self swizzle_sendAction:action to:target forEvent:event];

/// 收集数据}

@end

针对列表点击事件,以UITableView为例:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354

@implementation UIScrollView (ClickKit)

+ (void)load

{

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

[ClickKit swapMethod:[self class]

origMethod:@selector(setDelegate:)

newMethod:@selector(swizzle_setDelegate:)];

});

}

- (void)swizzle_setDelegate:(id)delegate

{

[self swizzle_setDelegate:delegate];

if ([self isKindOfClass:[UITableView class]]) {

[(UITableView *)self swizzle_tableViewDidSelectRowAtIndexPathInClass:delegate];

}

else if ([self isKindOfClass:[UICollectionView class]]) {

[(UICollectionView *)self swizzle_collectionViewDidSelectRowAtIndexPathInClass:delegate];

}

}

@end

@implementation UITableView (ClickKit)

- (void)swizzle_tableViewDidSelectRowAtIndexPathInClass:(id)delegate

{

if ([delegate isKindOfClass:[UITableView class]]) {

return;

}

if ([ClickKit hasMethod:[delegate class] sel:@selector(tableView:didSelectRowAtIndexPath:)])

{

SEL swizSel = NSSelectorFromString(@"swizzle_didSelectRowAtIndexPath");

if ([ClickKit addMethod:[delegate class] sel:swizSel method:(IMP)swizzle_didSelectRowAtIndexPath]) {

[ClickKit swapMethod:[delegate class] origMethod:swizSel newMethod:@selector(tableView:didSelectRowAtIndexPath:)];

}

}

}

void swizzle_didSelectRowAtIndexPath(id self, SEL _cmd, id tableView, id indexPath)

{

SEL selector = NSSelectorFromString(@"swizzle_didSelectRowAtIndexPath");

((void(*)(id, SEL, id, id))objc_msgSend)(self, selector, tableView, indexPath);

/// 收集数据

}

@end

四、数据存储

埋点数据采用db方式进行数据存储,一般依据事件类型,db结构由启动表、pv表和event表组成。具体怎么组织数据结构,需要上报什么数据,需要和大数据沟通。

五、数据上报

上报策略:

1、采用实时上传和离线上传相结合的方式,wifi和4G模式下,pv采用实时上报的方式,事件是随着下一个pv同时上传。

2、离线上传:其它网络情况下只做存储处理。

这个策略也只是建议,具体还看业务需求。

python埋点自动化_iOS自动化埋点的实现相关推荐

  1. Docker selenium自动化 - Python调用容器实例跑自动化查天气实例演示,docker selenium自动化环境部署过程

    Docker selenium自动化 - 环境部署与 Python 自动化运行实战演示 第一章:docker selenium 环境部署 ① 下载 selenium 镜像 ② 容器 selenium ...

  2. python接口测试框架实战与自动化进阶(三)

    python接口测试框架实战与自动化进阶 一.持续集成 1.持续集成环境搭建 1)安装Jenkins 官网下载后直接安装:https://jenkins.io/ 终端直接安装及启动:java -jar ...

  3. python watchdog占用,python基于watchdog库全自动化监控目录文件

    楔子 有些时候我们需要对一个目录进行监控,检测其内部是否有文件的新增.删除.以及每个文件的内容是否发生变化,这个时候如果是你的话,你会选择怎么做呢? 显然也是一个比较麻烦的工作,倒不是说难,主要是比较 ...

  4. python自动化_python自动化办公?学这些就够用了

    知乎上有人提问:用python进行办公自动化都需要学习什么知识呢? 这可能是很多非IT职场人士面临的困惑,想把python用到工作中,却不知如何下手? python在自动化办公领域越来越受欢迎,批量处 ...

  5. python做excel自动化-Python如何控制Excel实现自动化办公

    Python如何控制Excel实现自动化办公 发布时间:2020-04-07 09:51:44 来源:亿速云 阅读:132 作者:小新 这篇文章主要给大家讲解的是Python如何控制Excel实现自动 ...

  6. python网络安全论文题目_自动化毕业论文题目119个免费参考

    自动化毕业论文题目119个免费参考时间:2016-06-12 来源:未知 作者:chunt 本文字数:2522字 自动化专业有三个方向,工业自动化控制.电气自动化及自动化嵌入系统设计,选题可从这些方向 ...

  7. app小程序手机端Python爬虫实战12实现自动化退出考研帮app并清空缓存

    app小程序手机端Python爬虫实战11实现自动化退出考研帮app并清空缓存 一.捕获安卓吐司的消息 结束安卓的吐司操作: while True:if self.d.toast.get_messag ...

  8. 如何利用Python实现工作中的自动化

    如何利用Python实现工作中的自动化 "偷懒还能干完活,才是本事" 帅张发了一篇<工作要学会偷懒>,深感赞同. 有些事情既然定期都要处理,就没有更好的处理方式?能自动 ...

  9. 零基础入门智能射频---python的无人机测向天线自动化设计

    前言 多旋翼无人机具有环保.噪音小.体积小.重量轻.成本低.携带方便,具有速度可控.垂直起降.精准悬停等优势,已在民用领域,无人机在农林植保.抢险救灾.物流运输.安防巡检等方面发挥了重要作用:同时在军 ...

最新文章

  1. 2021年大数据ELK(二十四):安装Kibana
  2. Ioc 控制反转 实例
  3. 关于Delegate 和 MulticastDelegate的实现
  4. SQL Server 2008|2012 阻止保存要求重新创建表的更改
  5. 数字图像处理--图像二阶导数的推导
  6. input属性disabled和readonly的区别
  7. 假如Python有C/C++ 的性能,会不会称霸IT界?
  8. webapi 重复提交问题
  9. centos6.5系统不支持 mysql_centos6.5系统下面MySql数据库的安装
  10. Starling常见问题解决办法
  11. 奥威软件大数据bi_商业智能BI软件就是数据可视化工具吗?
  12. SqlServer支持多表关联的分页存储过程
  13. 将RGB转换为JPG格式到内存的代码
  14. 代数结构在计算机科学中的应用,代数结构
  15. 学术搜索,Web Of Science 核心合集检索方法,SCI分区及影响因子查看方法
  16. php公众号开发 点菜,微信公众号点餐系统怎么弄 微信点餐系统怎么开发
  17. cc2530单片机的内核是什么_ZigBee技术开发:CC2530单片机原理及应用简介,目录书摘...
  18. 阿里云搭建MQTT服务器
  19. 计算机在酒店的应用ppt,计算机应用论文的专辑
  20. in作为介词的用法_英语介词丨in、on 、at 的具体用法到底有哪些?

热门文章

  1. 每日英语:Relationship Repair: 10 Tips for Thinking Like a Therapist
  2. songsoft-关于加薪的策略
  3. 今天的新坑 ubuntu18.04安装docker
  4. 北京协和医院骨科完成中国首例机器人全膝人工关节置换手术
  5. 谷歌体三维捕捉新突破:实现后期任意照明修改
  6. Labview 属性节点讲解
  7. 马走日poj java超时_简单搜索poj 2243(水
  8. c语言变量作用域生命周期,C/C++——C++变量的作用域与生命周期,C语言中变量的作用域和生命周期...
  9. a=a+b与a+=b有什么区别吗?
  10. @ControllerAdvice这个注解主要作用是什么