iOS利用系统工具获取DeviceLog不是一件很方便的事,有时候我们运行的一些状态不一定显示在屏幕上,但是我们需要得到这一刻的一些数据。比如我们现在的产品人员要测试统计,比如按下某个按钮发送统计事件,整个界面上能够看到的也只是网络的菊花转了一圈,不能实质的看到统计的内容,并且在后台查询统计也不太容易,以及后台会有一定的延时等等原因,所以我做了一个工具,专门用于产品人员去测试一些客户端发送的某种类型的日志。
该工具的主要原理很简单,使用Socket搭了一个简易的HTTPServer,客户端可以使用二维码扫描获取服务器信息,然后存储起来,以后在需要的时候,给这个给这个HTTPServer发送HTTP请求就可以了,每次HTTPServer根据客户端所传的参数(内容/字体颜色/字体大小)去将客户端所传的内容展示在页面上就可以了。
应用主界面如图所示
主界面还是比较简单的,二维码的信息主要是存储当前服务器的访问地址,字体大小就是正文的默认字体大小,关闭则表示关闭服务器。
我们打开LogServer之后,就代表启动了HTTPServer,这时候如果我们通过浏览器进行一次HTTP请求,我们会把请求的内容打印到我们的HTTPServer上。假设我们请求如下
http://127.0.0.1:10304/?parameter=STTestLogServer&color=ff0000
我们就可以看到我们的LogServer中打印出来了一行字,为红色的STTestLogServer, 如图所示:
PS. 服务器默认端口号为10304, parameter就是我们要打印的内容,color则表示颜色,如果传入了font=16的话,则表示字体大小为16
工具的使用很简单,只需要客户端发送HTTP请求就可以了,对于客户端,我这边也封装好了一些逻辑,可以直接使用。有关二维码的扫描部分,是使用系统自带的AVFoundation,目前只支持iOS7以上,我直接贴下载地址了,就不粘贴到这里了,当然这个二维码只是工具,方便客户端记住服务端的信息,使用其他方式也可以,可以点此处下载STQRCode。同时,我也封装了几个方法,用于更方便的将日志打印粗来,网络库大家可以任意替换,目前服务器支持GET/POST请求(暂不支持mutilpart)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
void STDLogRemoteWithDebugString(NSString *string) { STDLogRemoteWithString(string, @"000000"); } void STDLogRemoteWithNoticeString(NSString *string) { STDLogRemoteWithString(string, @"199DD6"); } void STDLogRemoteWithWarningString(NSString *string) { STDLogRemoteWithString(string, @"FF7300"); } void STDLogRemoteWithErrorString(NSString *string) { STDLogRemoteWithString(string, @"FF0000"); } void STDLogRemoteWithString(NSString *string, NSString *colorString) { if (string.length == 0) { return; } static STHTTPNetwork *_logNetwork; NSString *remoteURL = [[NSUserDefaults standardUserDefaults] valueForKey:STLogRemoteCacheKey]; if (remoteURL) { if (!_logNetwork) { _logNetwork = [[STHTTPNetwork alloc] initWithHost:remoteURL path:nil]; } } else { _logNetwork = nil; } if (colorString.length == 0) { colorString = @"000000"; } _logNetwork.timeoutInterval = 2; _logNetwork.maxConcurrentRequestCount = 1; NSDictionary *parameters = @{@"parameter":string, @"color":colorString}; [_logNetwork sendAsynchronousRequestWithMethod:nil HTTPMethod:@"POST" parameters:parameters handler:^(STNetworkOperation *operation, id response, NSError *error) { }]; } |
扫描二维码部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
- (BOOL)canBecomeFirstResponder { return YES; } - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event { if (motion == UIEventSubtypeMotionShake) { STQRCodeScanViewController *viewController = STQRCodeScanViewController.new; viewController.continueWhenScaned = YES; if (viewController) { viewController.scanCompletionHandler = ^(STQRCodeScanViewController *vc, NSString *result, NSError *error) { NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; NSURL *requestURL = [NSURL URLWithString:result]; if (requestURL.path.length > 0 && [requestURL.path rangeOfString:@"stkit"].location != NSNotFound) { NSString *title = nil; if ([requestURL.path rangeOfString:@"close"].location != NSNotFound) { // 断开连接 requestURL = nil; title = @"已断开测试统计链接"; } else { title = @"已连接到测试统计服务器"; } UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title message:nil delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil]; [alertView show]; if (requestURL) { [userDefaults setValue:result forKey:STLogRemoteCacheKey]; } else { [userDefaults setValue:nil forKey:STLogRemoteCacheKey]; } [userDefaults synchronize]; [vc dismissAnimated:YES]; } }; [self.window.rootViewController presentViewController:viewController animated:YES completion:NULL]; } } } |
我习惯把一些测试功能加到window的摇一摇上,这样方便。最后运行结果如下:
这个工具只是提供一种功能,代码写的也比较粗糙,只为抛砖引玉。有兴趣的可以私我,大家一起完善Server端。 STLogServer下载地址
PS.该Server是使用Java写的,所以需要Java虚拟机来支持程序的运行,大家需要自行安装JRE。 JRE官方下载地址