写这个小工具的想法,主要来源于不少团队都会用友盟、TalkingData 等第三方框架作自定义事件统计;不过统计代码加好以后,没有很好的方法来让测试工程师验证一下事件加上了没有,调用次数有没有重复等。git
因此写了这个小工具,是一个保持在最前的 UIWindow,能够实时打印 log。github
源码是用 Objective-C 写的,放在 github 上了。数组
只需把 HAMLogOutputWindow.h
、HAMLogOutputWindow.m
两个文件加到工程中。若是您使用友盟或者 TalkingData 作事件统计,也能够加进来 demo 工程中的 HAMStatisticsManager.h
和 HAMStatisticsManager.m
。app
启用这个 debug 窗口很是简单,只需一行代码:框架
[[HAMLogOutputWindow sharedInstance] setHidden:NO];复制代码
您能够把这行代码加到 AppDelegate.m
里,例如:工具
#define SHOW_STATISTICS_DEBUG 1
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
#if DEBUG && SHOW_STATISTICS_DEBUG
[[HAMLogOutputWindow sharedInstance] setHidden:NO];
#endif
return YES;
}复制代码
不需显示 时把 define 的1
改成0
便可,也保证了在 release 版本中不会出现。测试
输出 log:spa
[HAMLogOutputWindow printLog:@"some log"];复制代码
输出的 log 会滚动显示在 debug 窗口中,末尾会自动添加换行。最新的 log(0.1s 以内)会显示为黄色,以前的会显示为白色。debug
如需清空 log,只需调用:code
[HAMLogOutputWindow clear];复制代码
用来存储 log 信息的 model 类。有两个属性,时间戳和具体的 log 内容。
是一个单例的 Window,里面有一个 UITextView
用来显示 log。windowLevel
设为 UIWindowLevelAlert
因此能保持在最前。userInteractionEnabled 设为 NO,这样屏幕触摸事件会传递到下层的实际 view 上去,不会挡住测试的操做。
打印 log 的时候,创建一条 log 对象存进 logs
数组里。logs
数组实际是个队列,超出 20 条以后就会抛弃最旧的一条。以后调用 refreshLogDisplay
刷新 log 的显示。
在 refreshLogDisplay
这个方法中,首先根据 logs
数组构造一个 attributedString。其中时间戳与当前时间相差 0.1s 之内的,显示为黄色,不然显示为白色。这样就能在视觉上把先后关联比较紧密的 log 同时高亮,好比点击 tab 和相应 viewController 的 viewWillAppear
两个统计事件。
最后用如下代码让显示 log 的 UITextView
滚动到底部。
NSRange bottom = NSMakeRange(attributedString.length - 1, 1);
[self.textView scrollRangeToVisible:bottom];复制代码
代码很是简单,在此基础上能够根据本身项目的需求进行改造。拿去用吧~