美文网首页
iOS-AOP的简单应用for统计日志

iOS-AOP的简单应用for统计日志

作者: MrPlusZhao | 来源:发表于2018-02-06 16:33 被阅读43次

AOP(what ? ) :

首先我们来简单的解释一下AOP(面向切面编程)

(个人觉得这个回答比较好:https://www.zhihu.com/question/24863332)

简单来讲就是在运行时(要涉及到Runtime的方法),动态的将代码切入到类的指定方法,指定位置上.这样的编程思想就是面向切面编程,我理解的它的优点是: 1:降低代码复杂度,提高开发效率 2:一定程度上有效减少代码耦合性

实际应用:
此处附上Demo地址:https://github.com/MrPlusZhao/ZTPMethodExchange
假如有这样一个需求,运营要求我们的APP统计每一个页面的访问频率数据,那么我们就需要程序在运行时,有一个触发点来和后台进行沟通,记录访问该页面的次数,现在我们就针对UIViewController的WillDidAppear方法作为沟通入口,进行无侵入式的操作

思路是这样:

    1:创建一个UIViewController的扩展类

    2:动态的替换WillDidAppear的实现方法

    3:在WillDidAppear里面和后台进行数据传输

1:创建一个UIViewController的扩展类

这个过程比较简单,截图在此,不多解释了

image

2:动态的替换WillDidAppear的实现方法
这个过程比较重要我们需要用的Runtime(如果Runtime有点迷糊的小伙伴请猛戳这里https://www.cnblogs.com/ioshe/p/5489086.html)

要使用Runtime方法,头文件需要引入#import<objc/message.h>

@implementation UIViewController (Statistics)

+ (void)load
{
    [self ZTPMethodSwizzing:self  methodOld:@selector(viewDidAppear:) methodNew:@selector(ZTP_WillDidAppear:)];
    
}
BuildSetting里面开启权限

要动态修改方法,我们必须要先拿到这个方法,Runtime有一个方法是

class_getInstanceMethod
//用法如下,用Runtime的方法,先要去 BuildSetting里面开启权限 截图在上面
把Enable Strict Checking.......设置成NO
//思路是,
//1.先获取原来的方法,再获取新的方法,然后进行替换
 /**2:若UIViewController类没有该方法,那么它会去UIViewController的父类去寻找,为了避免不必要的麻烦,我们先进行一次添加
    */
    //3: 如果原来类没有这个方法,可以成功添加,如果原来类里面有这个方法,那么将会添加失败
//最后就是你新写的方法里面实现你要做的事情

#import "UIViewController+Statistics.h"
#import <objc/message.h>


@implementation UIViewController (Statistics)

+ (void)load
{
    [self ZTPMethodSwizzing:self methodOld:@selector(viewDidAppear:) methodNew:@selector(ZTP_WillDidAppear:)];
    
}

+ (void)ZTPMethodSwizzing:(Class)className methodOld:(SEL)oldMethod methodNew:(SEL)newMethod
{
    //1:先拿到这两个方法
    Method originalMethod = class_getInstanceMethod(className, oldMethod);
    Method swizzledMethod = class_getInstanceMethod(className, newMethod);

    
    /**2:若UIViewController类没有该方法,那么它会去UIViewController的父类去寻找,为了避免不必要的麻烦,我们先进行一次添加
    */
    BOOL AddMethod = class_addMethod(className, oldMethod, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));
    
    //3: 如果原来类没有这个方法,可以成功添加,如果原来类里面有这个方法,那么将会添加失败
    if (AddMethod) {
        class_replaceMethod(className, oldMethod, class_getMethodImplementation(className, newMethod), method_getTypeEncoding(swizzledMethod));
    }
    else
    {
        method_exchangeImplementations(originalMethod, swizzledMethod);
    }
}

- (void)ZTP_WillDidAppear:(BOOL)isAnimation
{
    [self ZTP_WillDidAppear:isAnimation];
    NSString * namestr = NSStringFromClass([self class]);
    
    NSLog(@"do something for statics in class %@",namestr);
    //如果项目中集成了友盟统计,那么就可以在此处实现
//    [MobClick beginLogPageView:namestr];
}


相关文章

  • iOS-AOP的简单应用for统计日志

    AOP(what ? ) : 首先我们来简单的解释一下AOP(面向切面编程) (个人觉得这个回答比较好:https...

  • rsyslog日志管理

    一:日志的重要性 日志分类:系统日志,进程日志,应用程序日志记录日志的用处:排错,追溯事件,统计流量,审计安全行为...

  • 使用grep命令或notepad++ 快速搜索日志的实用技巧

    在做测试时,我们经常会遇到日志分析的统计工作,那么如何高效的完成日志分析功能呢?这里以统计研发同学应用日志中的ap...

  • HarmonyOS开发 C++中打印日志

    在HarmonyOS应用开发中打印日志很简单,HarmonyOS提供了HiLog日志系统,帮助开发者了解应用/服务...

  • 拦截器适配器HandlerInterceptorAdapter

    应用场景1、日志记录,可以记录请求信息的日志,以便进行信息监控、信息统计等。2、权限检查:如登陆检测,进入处理器检...

  • Android Handler机制 - MessageQueue

    一次trouble-shooting 最近在查看应用的线上日志统计时,发现一个 MessageQueue.nati...

  • 数据分析

    数据来源: 产品日志、客户管理系统、访问情况的统计信息。 数据分析的方法: 最简单的excel、复杂点的用一些统计...

  • 10分钟搞懂Java日志体系

    前言 对于一个应用程序来说日志记录是必不可少的一部分。线上问题追踪,基于日志的业务逻辑统计分析等都离不日志。jav...

  • NGINX日志分析

    Nginx日志分析 日志记录: 1.统计日志中访问最多的10个IP(shell中管道越少运行越快) 2.统计日志中...

  • Oracle logminer

    归档日志量统计 日志生成量最大的对象 (按小时统计) 使用logminer分析归档日志 1.使用脚本创建相关的包 ...

网友评论

      本文标题:iOS-AOP的简单应用for统计日志

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