运行效果图
既然大家能看到这篇文章就应该对埋点有所了解,不了解的可以查看数据埋点 ,本文不做叙述
一、首先 集成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
}
网友评论