一、技术原理

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. 利用ffmpeg将H264流 解码为RGB

    利用H264解码分为几个步骤: 注意一点在添加头文件的时候要添加extern "C",不然会出现错误 [cpp] view plaincopy extern "C&quo ...

  2. PL/SQL NOCOPY限制模式

    NOCOPY模式用于限定OUT模式和IN OUT模式在调用时是不是以传引用的方式进行. 默认情况下,OUT模式和IN OUT模式的参数是以传值的方式进行调用的. IN模式总是以传引用的方式,如果用NO ...

  3. HTML5结合CSS的三种方法+结合JS的三种方法

    HTML5+CSS: HTML中应用CSS的三种方法 一.内联 内联样式通过style属性直接套进HTML中去. 示例代码 <pstylepstyle="color:red" ...

  4. PyCharm 2017.3 下载与安装

    微信公众号:compassblog 欢迎关注.转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1.下载 (1).下载链接: https://www.jetbrains.com/pycharm ...

  5. freemarker基本数据类型(十一)

    freemarker基本数据类型 1.基本数据类型 (1)字符串 (2)数字 (3)布尔值 (4)日期 2.展示示例 <html> <head> <meta http-e ...

  6. 凯撒密码加密解密--JAVA实现(基础)

    凯撒密码一种代换密码,据说凯撒是率先使用加密函的古代将领之一,因此这种加密方法被称为恺撒密码.凯撒密码的基本思想是:通过把字母移动一定的位数来实现加密和解密.明文中的所有字母都在字母表上向后(或向前) ...

  7. Labview中嵌入flex/flash

    将flash动画作为ActiveX文档插入LabVIEW程序的前面板的方法 (1)在前面板插入Controls的ActiveX Container控件. (2)在Container控件上单击鼠标右键, ...

  8. 【BZOJ1146】网络管理(整体二分)

    [BZOJ1146]网络管理(整体二分) 题面 良心洛谷,有BZOJ权限题 题解 要看树套树的戳这里 毕竟是:智商不够数据结构来补 所以, 我们来当一回智商够的选手 听说主席树的题目大部分都可以整体二 ...

  9. Gulp-自动化编译sass和pug文件

    突然发现在我博客文章中,缺少这一块的记录,那我就补一篇吧. gulp的环境配置和安装:http://www.cnblogs.com/padding1015/p/7162024.html 这里就补充一篇 ...

  10. 伯克利推出世界最快的KVS数据库Anna:秒杀Redis和Cassandra

    天下武功,唯快不破. 伯克利 RISE 实验室推出了最新的键值存储数据库 Anna,提供了惊人的存取速度.超强的伸缩性和史无前例的一致性保证.Jeff Dean 说,当一个系统增长到十倍规模时,就需要 ...