美文网首页
在swift 中 通过AOP来进行埋点

在swift 中 通过AOP来进行埋点

作者: Top_木木 | 来源:发表于2017-06-19 12:46 被阅读361次

    运行效果图  

    既然大家能看到这篇文章就应该对埋点有所了解,不了解的可以查看数据埋点 ,本文不做叙述

    项目下载地址

    一、首先 集成Aspect框架 (两种方式,一种直接把 Aspects.h/Aspects.m 拖拽。第二中 cocoaPods集成 )

    二、需要一个plist文件 (埋点检测实质就是通过这个plist文件利用runtime进行对应查找)这个plist 在需要埋点的地方进行手动添加的。

    plist属性参考:

    首先是对应视图控制器的名字 如图中的ViewController

    GLLoggingTrackedEvents为固定的字段名,内容为Array

    Array中包含多个Dictionary, Dictionary中的字段名如下:

    * GLLoggingFuncDesc 是事件描述

    * GLLoggingFuncName 是事件名

    * GLLoggingSelectorName 是方法名

    注意: 挂钩使用的是SEL,所以如果方法是需要传入参数的,方法名末尾需要增加":"(注意区分中英文字符)



    三、我这里创建一个BuryLog.swift文件,为了方便挂钩使用(核心代码文件)

    注意:这里有坑点

    坑点1:swift 和OC 不同,根据字符串获取对应的类 OC中使用 “NSClassFromString”就可获取 ,swift由于命名空间的存在,导致该方法失效

    解决方式:首先获取该项目文件的命名空间,再通过字符串拼接转换即可获取字符串对应的类

    guard let nameSpage = Bundle.main.infoDictionary!["CFBundleExecutable"] as? String else {

    print("没有命名空间")

    return

    }

    guard let childVcClass = NSClassFromString(nameSpage + "." + vcName) else {

    print("没有获取到对应的class")

    return

    }

    坑点2.在这里通过 类来调用Aspect,的 aspect_hook(Selector!, with: AspectOptions, usingBlock: Any!) 方法时,会出现各种报错(笔者就是死在这里(有一种报错直接连接到苹果官网,B了🐶,后来莫名其妙又没有了))。

    主要说下关键报错点

    1.调用上面方法会有异常抛出,需要 通过

    do {

    try _ = childVcClass.aspect_hook(Se, with: .positionBefore , usingBlock:wrappedObject)

    } catch  {

    print(error)

    }

    捕获

    2.这里的usingBlock一定不为空,否则会报错  所以定义一个block(不会的可以拷贝)在这个block可以进行网络请求完成埋点目的),参数可以获取具体要发什么参数可以和你们后台商量(

    let wrappedBlock:@convention(block) (AspectInfo)-> Void = { aspectInfo in

    }

    let wrappedObject: AnyObject = unsafeBitCast(wrappedBlock, to: AnyObject.self)

    四、配置文件

    在Appdelegate里

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    //配置,埋点文件

    BuryLog().setupWithConfiguration()

    return true

    }

      github下载地址


    相关文章

      网友评论

          本文标题:在swift 中 通过AOP来进行埋点

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