需求

写这个小工具的想法,主要来源于很多团队都会用友盟、TalkingData 等第三方框架做自定义事件统计;不过统计代码加好之后,没有很好的方法来让测试工程师验证一下事件加上了没有,调用次数有没有重复等。

所以写了这个小工具,是一个保持在最前的 UIWindow,可以实时打印 log。

源码地址

源码是用 Objective-C 写的,放在 github 上了。

https://github.com/DaiYue/HAMLogOutputWindow

用法

集成

只需把 HAMLogOutputWindow.h、HAMLogOutputWindow.m 两个文件加到工程中。如果您使用友盟或者 TalkingData 做事件统计,也可以加进来 demo 工程中的 HAMStatisticsManager.h 和 HAMStatisticsManager.m。

开启

启用这个 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

输出 log:

[HAMLogOutputWindow printLog:@"some log"];

输出的 log 会滚动显示在 debug 窗口中,末尾会自动添加换行。最新的 log(0.1s 之内)会显示为黄色,之前的会显示为白色。

如需清空 log,只需调用:

[HAMLogOutputWindow clear];

源码解释

HAMLog

用来存储 log 信息的 model 类。有两个属性,时间戳和具体的 log 内容。

HAMLogOutputWindow

是一个单例的 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];

iOS 设备屏幕上实时打印 Log 的小工具的更多相关文章

  1. 解决iOS设备屏幕切换时页面造成的问题

    环境:IOS6~7 Safari 问题:iOS设备屏幕切换时可能会造成屏幕变大,出现左右间距等问题 解决方法: 头部加入<meta name = "viewport" con ...

  2. iOS设备屏幕分辨率分布

    iOS设备屏幕分辨率比较单一,960*640是iPhone4和4s的分辨率,占比67.4%;1024*768是iPad1和iPad2的分辨率,占比22.5%;480*320是iPhone3和3gs的分 ...

  3. ios设备屏幕尺寸与分辨率

    iOS 设备的屏幕尺寸.分辨率及其屏幕边长比例详细情况是怎样的? 根据屏幕尺寸和分辨率,ios现在数起来有6个版本.一,3GS:二,4s为代表:三,iphone5:四,ipad2为代表:五,ipad4 ...

  4. Xenko基础API笔记3- Pointers指针设备屏幕上点对应的手指触摸。

    样本这里是一个简单的示例程序,跟踪目前在屏幕上的指针和打印他们的位置.访问输入字段,类继承自@ SiliconStudio.Xenko.脚本的类. public override async Task ...

  5. iOS---实现在屏幕上实时绘图的简单效果---CAShaperLayer和UIBezierPath的简单运用

    首先,声明几个属性 @property(nonatomic,strong)UIBezierPath * beizer; @property(nonatomic,assign)CGPoint start ...

  6. iOS设备 屏幕尺寸、操作系统、摄像头像素、发行时间 汇总

    设备 硬件尺寸 软件尺寸 精密程度 操作系统 摄像头像素 发行时间 iPhone 4s 640 x 960 320 x 480 2x iOS 5 800万 2011.10.04 iPhone 5 64 ...

  7. iOS设备屏幕像素总览

    本文永久地址为http://www.cnblogs.com/ChenYilong/p/4011728.html ,转载请注明出处.   本文永久地址为http://www.cnblogs.com/Ch ...

  8. 实时跟踪log变化的工具Apachetop

    作为一个网站管理员,我们经常会有需要知道当前什么人正在访问我们的网站,谁正在频繁的抓取我们网站的内容,什么搜索引擎正在抓取我们网站?面对这些问题,我们虽然可以去查看log日志文件,但是却不能让我们实时 ...

  9. CentOS下安装实时检测网络带宽的小工具bmon

    首先下载rpmforge-release扩展的rpm包 32位操作系统:wget http://www.sudu.us/Tools/bmon/rpmforge-release-0.3.6-1.el5. ...

随机推荐

  1. 关于如何使用javascript监听滚动条滚动事件

    在网页中,通常有一个通往网页顶部的锚点,现在我们就来实现它 Html代码: <a id="scrollup" href="#top" style=&quo ...

  2. wifidog 源码初分析(2)-转

    上一篇分析了接入设备的首次浏览器访问请求如何通过 防火墙过滤规则 重定向到 wifidog 的 HTTP 服务中,本篇主要分析了 wifidog 在接收到 接入设备的 HTTP 访问请求后,如何将此 ...

  3. Managed C++ dll: #define _AFXDLL or do not use /MD[ d]?

    [问题] Hello all     I'm writing a managed C++ dll with will be acting as an intermediate between a lo ...

  4. PDO 增删改查封装的类

    Selecting Data 你在mysql_*中是这样做的 <?php $result = mysql_query('SELECT * from table') or die(mysql_er ...

  5. Python标准库:内置函数type(object)

    type(object) type(name, bases, dict) 本函数是返回对象的类型对象.仅仅有一个參数object时,直接返回对象的类型对象.假设仅仅是想推断一个对象是否属于某一个类的对 ...

  6. 保存登录plsql developer 的用户名和密码

    1 保存用户名 tools -> Preferences -> User Interface - Options 勾选 Autosave username . 保存 2 保存密码 tool ...

  7. springside

    springside安装:http://www.oschina.net/question/582149_75623 1 安装maven,配置环境变量2 下载springside4 https://gi ...

  8. MyBatis对于Java对象里的枚举类型处理

    平时咱们写程序实体类内或多或少都会有枚举类型属性,方便嘛.但是mybatis里怎么处理他们的增删改查呢? 要求: 插入的时候,会用枚举的定义插入数据库,我们希望在数据库中看到的是数字或者其他东西: 查 ...

  9. poj2689 Prime Distance 有难度 埃拉托斯尼斯筛法的运用

    我承认这道很难(对我来说),搞脑子啊,搞了好久,数论刚开始没多久,还不是很强大,思路有点死,主要是我 天赋太差,太菜了,希望多做做有所改善 开始解析: 首先要将在 [ l,u]内的所有素数找出来,还好 ...

  10. JAVA中JDBC连接Mysql数据库简单测试

    一.引用库 maven库:mysql:mysql-connector-java:6.0.6 二.SDK环境 JAVA JDK10 三.测试代码 package com.mysql.mysqlconne ...