一、技术原理

Method-Swizzling 黑魔法 方法交换(不懂的可以查)

二、页面统计

某盟页面统计SDK需要开发者在APP基类里实现ViewDidAppear和viewDidDisappear方法,或者在某个特定的类实现以上俩方法,优点是具体情况具体埋点。下面采用无侵入式埋点实现页面统计,无需APP开发者实现以上俩方法,适用于开发开发SDK的公司,无感知采集APP信息。

三、代码实现

#import <UIKit/UIKit.h>

@interface UIViewController (FRHook)

@end

#import "UIViewController+FRHook.h"

#import <objc/runtime.h>

@implementation UIViewController (FRHook)

+(void)load{

Method appearMethod = class_getInstanceMethod([self class], @selector(viewDidAppear:));

Method hookAppearMethod = class_getInstanceMethod([self class], @selector(hook_ViewDidAppear:));

method_exchangeImplementations(appearMethod, hookAppearMethod);

Method disappearMethod = class_getInstanceMethod([self class], @selector(viewDidDisappear:));

Method hookDisappearMethod = class_getInstanceMethod([self class], @selector(hook_viewDidDisappear:));

method_exchangeImplementations(disappearMethod, hookDisappearMethod);

}

- (void)hook_ViewDidAppear:(BOOL)animated

{

[self hook_ViewDidAppear:animated];

if (![self isKindOfClass:[UINavigationController class]]&&![self isKindOfClass:[UITabBarController class]]) {

NSString *appearDetailInfo = [NSString stringWithFormat:@" %@ - %@ - %@", NSStringFromClass([self class]),self.navigationItem.title, @"didAppear"];

//        NSLog(@"%@", appearDetailInfo);

//上传到服务器

}

}

- (void)hook_viewDidDisappear:(BOOL)animated

{

[self hook_viewDidDisappear:animated];

if (![self isKindOfClass:[UINavigationController class]]&&![self isKindOfClass:[UITabBarController class]]) {

NSString *disappearDetailInfo = [NSString stringWithFormat:@" %@ - %@ - %@", NSStringFromClass([self class]),self.navigationItem.title, @"didDisappear"];

//        NSLog(@"%@", disappearDetailInfo);

//上传到服务器

}

}

四、举一反三

怎么采集用户的的触摸信息?

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; background-color: #ffffff }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; background-color: #ffffff }

Hook 无侵入式埋点(页面统计)的更多相关文章

  1. 使用AOP思想无侵入式申请权限,解决组件化中权限问题(一)

    首先介绍AspectJx使用 https://github.com/HujiangTechnology/gradle_plugin_android_aspectjx 在根项目的build.gradle ...

  2. php使用装饰模式无侵入式加缓存

    <?php namespace App\Services; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\ ...

  3. Spring Boot 无侵入式 实现RESTful API接口统一JSON格式返回

    前言 现在我们做项目基本上中大型项目都是选择前后端分离,前后端分离已经成了一个趋势了,所以总这样·我们就要和前端约定统一的api 接口返回json 格式, 这样我们需要封装一个统一通用全局 模版api ...

  4. Android平台免Root无侵入AOP框架Dexposed使用详解

    Dexposed是基于久负盛名的开源Xposed框架实现的一个Android平台上功能强大的无侵入式运行时AOP框架. Dexposed的AOP实现是完全非侵入式的,没有使用任何注解处理器,编织器或者 ...

  5. Android新技术学习——阿里巴巴免Root无侵入AOP框架Dexposed

    阿里巴巴无线事业部近期开源的Android平台下的无侵入运行期AOP框架Dexposed,该框架基于AOP思想,支持经典的AOP使用场景.可应用于日志记录,性能统计,安全控制.事务处理.异常处理等方面 ...

  6. 小议webpack下的AOP式无侵入注入

    说起来, 面向切面编程(AOP)自从诞生之日起,一直都是计算机科学领域十分热门的话题,但是很奇怪的是,在前端圈子里,探讨AOP的文章似乎并不是多,而且多数拘泥在给出理论,然后实现个片段的定式)难免陷入 ...

  7. 无侵入方面编程-用HttpModule+SoapExtension监视页面执行参数(二)

    上一篇文章 "无侵入方面编程-用HttpModule+SoapExtension监视页面执行参数(一)"中,我们实现了监视每个页面的执行情况和调用WebService的简单信息. ...

  8. APP埋点:页面统计与事件统计该如何入手?

    我们平时所说的埋点,可以大致分为两部分,一部分是统计APP页面访问情况,即页面统计:另外一部分是统计APP内的操作行为,及自定义事件统计. 一.页面统计 页面统计,可以统计应用内各个页面的访问次数(P ...

  9. 友盟页面统计 - 关于Viewpager中的Fragment的生命周期

    Activity和Fragment各自理论上的生命周期 Activity的生命周期是较为经典也最清晰的,在此不表: Fragment从出现到广泛运用也有一段时间了,其标准生命周期也仅比Activity ...

随机推荐

  1. Linux显示查看您拥有的仓库

    Linux显示查看您拥有的仓库 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ yum repolist all repolist: 0

  2. TypeError: Error #1034: 强制转换类型失败:无法将 "0.49" 转换为 mx.graphics.IFill。

    1.错误描述 TypeError: Error #1034: 强制转换类型失败:无法将 "0.49" 转换为 mx.graphics.IFill. at mx.charts.ser ...

  3. 芝麻HTTP:Scrapy-Splash的安装

    Scrapy-Splash是一个Scrapy中支持JavaScript渲染的工具,本节来介绍它的安装方式. Scrapy-Splash的安装分为两部分.一个是Splash服务的安装,具体是通过Dock ...

  4. JavaScript设计模式(3)-工厂模式

    工厂模式 1. 简单工厂 简单工厂:使用一个类或对象封装实例化操作 假如我们有个自行车商店类 BicycleShop,它提供了销售自行车的方法可以选择销售两类自行车 Speedster,Comfort ...

  5. 数列分块总结——题目总版(hzwer分块九题及其他题目)(分块)

    闲话 莫队算法似乎还是需要一点分块思想的......于是我就先来搞分块啦! 膜拜hzwer学长神犇%%%Orz 这九道题,每一道都堪称经典,强力打Call!点这里进入 算法简述 每一次考试被炸得体无完 ...

  6. 【BZOJ3669】【Noi2014】魔法森林(Link-Cut Tree)

    [BZOJ3669][Noi2014]魔法森林(Link-Cut Tree) 题面 题目描述 为了得到书法大家的真传,小 E 同学下定决心去拜访住在魔法森林中的隐 士.魔法森林可以被看成一个包含 n ...

  7. [Luogu3121][USACO15FEB]审查Censoring

    题面 sol 开一个栈记录依次经过的\(AC\)自动机上的节点编号以及这一次的字母,若匹配到一个串就直接弹掉栈顶的\(len\)个元素,\(len\)为匹配到的模式串长度.弹栈顶直接\(top-=le ...

  8. [SCOI2007]蜥蜴

    网络流 一个点拆成两个,注意要把某一类边连反过来 这样才能保证有限制 # include <bits/stdc++.h> # define IL inline # define RG re ...

  9. java输出日志

    protected final Logger logger = Logger.getLogger(User.class); logger.info("在控制台中打印的内容");

  10. 论文笔记(6):Weakly-and Semi-Supervised Learning of a Deep Convolutional Network for Semantic Image Segmentation

    这篇文章的主要贡献点在于: 1.实验证明仅仅利用图像整体的弱标签很难训练出很好的分割模型: 2.可以利用bounding box来进行训练,并且得到了较好的结果,这样可以代替用pixel-level训 ...