在ios项目中使用iConsole,实现程序内debug

还记得上次微信的4.3.3版中三指向上滑就可以调出iConsole控制台吗?当时还是蛮好奇的。随便了解了一下,没有深入。最近项目给甲方测试。老是反馈说在他们的网络下崩溃,而我却无法重新现bug。于是就想到了内置这个iconsole,看看他使用时的log。

IMG_0541

我在github下到了开源的iconsole源码和demo,很遗憾,github刚被我们伟大的GFW封了,所以想看官方的demo的话,可以到这里下:iconsole官方demo

下面开始使用iConsole

首先创建一个测试工程。
加入iConsole 和GTM 源码到工程中,如下图

QQ20130123-8

然后,需要使用把UIWindow改成iConsoleWindow

这步非常重要。我的xocde是4.5,但是因为这个官方demo时间比较久了,xcode比较老。当时还有MainWindow.xib 。他在这个xib中把window直接指定为iConsoleWindow类(这个的作用下面讨论)。一开始没注意到这点,一直无法在程序中调出debug节目,折腾我许久啊!!

那么在我们现在的项目中修改如下:

在AppDelegate.h中:

首先加入头文件

#import “iConsole.h”

然后修改

@property (strong, nonatomic) iConsoleWindow *window; //这是关键,必须使用iConsoleWindow

很简单,一切ok了。最后,就可以在需要的地方使用iconsole记录日志了。

我是在AppDelegate.m中加入iConsole的。先在h文件中加入iConsoleDelegate协议

@interface AppDelegate : UIResponder <UIApplicationDelegate,iConsoleDelegate>

然后在

didFinishLaunchingWithOptions中加入

[iConsole sharedConsole].delegate = self;

[iConsole sharedConsole].logSubmissionEmail = @”apanlin@gmail.com”;

然后还要实现协议中的方法:

- (void)handleConsoleCommand:(NSString *)command
{
if ([command isEqualToString:@"version"])
{
[iConsole info:@"%@ version %@",
[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"],
[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]];
}
else
{
[iConsole error:@"unrecognised command, try 'version' instead"];
}
}

最后只需要在需要的地方输出日志就好了
[iConsole info:@”测试log”];

详细的可以参考最后面的demo!

=============================

现在说说为什么一定要使用iConsoleWindow了。上面说到iConsoleWindow是UIWindow的子类,它覆盖了

– (void)sendEvent:(UIEvent *)event 方法。

而这个就涉及到了ios系统对事件的响应的问题了。

当用户发起一个事件,比如触摸屏幕或者晃动设备,系统产生一个事件,同时投递给UIApplication,而UIApplication则将这个事件传递给特定的UIWindow进行处理(正常情况都一个程序都只有一个UIWindow),然后由UIWindow将这个事件传递给特定的对象(即first responder)并通过响应链进行处理。

而这个正是载iconsoleWindow中把响应事件截取,判断是不是3根指头同时向上,是的话就显示debug界面。

关于ios事件的响应和截取,可以参考这里。这也是通过这个demo学到的新知识!

如果需要我的测试demo的话,请从这里下载

发表评论

电子邮件地址不会被公开。 必填项已用*标注