`
lizaochengwen
  • 浏览: 643158 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

转:iOS IO 重定向(NSLog to UITextView)

阅读更多
情形描述:

在调试程序的时候,通过NSLog打印log,很方便的就可以在Xcode里面看到。但是程序一旦“离开XCode运行”, 比如将App交付给了公司的测试团队,怎样能够很随意看到NSLog打印的信息呢?通常在离开xcode之后,NSLog的信息会保存在Systemlog里面(这里有NSLog详细描述),你可以通过一定办法取出这个log。甚至可以写一套日志系统,然后将这些信息保存到日志中,然后导出或者上传自己的服务器。但是这些太麻烦了,简直是弱爆鸟。我们的目的是:在App里面能够直接像xCode console窗口那样显示NSLog的信息,准确的说是标准输出的信息。

关键技术:IO重定向

通过IO重定向,我们可以直接“截取” stdout,stderr等标准输出的信息(NSLog->stderr),然后再在自己的View上显示出来。这里只展示IO重定向相关代码。
@implement TestAppDelegate

- (void)redirectNotificationHandle:(NSNotification *)nf{
  NSData *data = [[nf userInfo] objectForKey:NSFileHandleNotificationDataItem];
  NSString *str = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];

  self.logTextView.text = [NSString stringWithFormat:@"%@\n%@",self.logTextView.text, str];
  NSRange range;
  range.location = [self.logTextView.text length] - 1;
  range.length = 0;
  [self.logTextView scrollRangeToVisible:range];

  [[nf object] readInBackgroundAndNotify];
}

- (void)redirectSTD:(int )fd{
  NSPipe * pipe = [NSPipe pipe] ;
  NSFileHandle *pipeReadHandle = [pipe fileHandleForReading] ;
  dup2([[pipe fileHandleForWriting] fileDescriptor], fd) ;

  [[NSNotificationCenter defaultCenter] addObserver:self
                                           selector:@selector(redirectNotificationHandle:)
                                               name:NSFileHandleReadCompletionNotification
                                             object:pipeReadHandle] ;
  [pipeReadHandle readInBackgroundAndNotify];
}
- (BOOL)application:(UIApplication *)application 
didFinishLaunchingWithOptions:(NSDictionary *)launchOption{

  [self redirectSTD:STDOUT_FILENO];
  [self redirectSTD:STDERR_FILENO];

//YOUR CODE HERE...
}

//YOUR CODE HERE...

@end

主要代码就功能就是:

    通过NSPipe创建一个管道(这里有详细讲NSPipe的文章),pipe有读端和写端。
    通过dup2(这里有详细将dup2的文章)讲标准输入重定向到pipe的写端。
    通过NSFileHandle监听pipe的读端,然后讲读出的信息显示在uitextview上。

通过上面三步,一旦通过printf或者NSLog写数据,因为重定向过,这些数据都会写到Pipe的写端。同时pipe会将这些数据从写端直接传送到读端。读端通过NSFileHandle的“监控”函数取出这些数据,并最终显示在uitextview上。

DONE!
在真实的项目中,你可以设置一个开关去开启或者关闭这个重定向。在调试测试程序的过程中,打开开关,快捷及时查看程序运行状况;产品发布的时候关掉开关就OK了,用户可以毫不知情。这样,也许会提高不少社会主义生产力。

下面展示一下效果截图:
分享到:
评论

相关推荐

    重定向NSLog 输出到本地案例

    作者jiaforios,源码ZJDebugLogView,实现方法:重定向NSLog 输出到本地 实现脱机下同样可以查看输出日志 使用方法: 在全局头文件中(.pch 文件) 中重新宏定义 NSLog #define NSLog(format, ...) do { \ (NSLog...

    通过重定向NSLog过滤WKWebView [Process] kill() returned unexpected error 1

    网上有很多关于解决WKWebView错误日志不停打印 [Process] kill() returned ...其实我们可以通过重定向NSLog,过滤掉不需要的信息,然后使用非标准错误流输出日志信息。下面是实现代码: Swift版本 #if DEBUG pr

    iOS中日志同步获取NSLog重定向以及其他详解

    前言 对于那些做后端开发的工程师来说,看LOG解Bug应该是理所当然的事,但我接触到的移动应用开发的工程师里面,很多...在iOS开发中,我们经常会用到NSLog调试,但是我们却不太了解它。在NSLog本质是一个C函数,它的函

    BetterNSLog:更好的 NSLog 实现

    这个简单的库(充满了预处理器的魔力)隐藏了 NSLog 并添加了一个名为 DLog 的“调试”NSLog 命令。 在你需要的地方导入BetterNSLog.h ,你就可以开始了。 这... NSLog(format,...) ...印刷: [APPNAME] ...

    IOS NSlog处理

    IOS上线项目NSLog处理

    扩展NSLog实现按class的自定义NSLog内容输出

    在iOS开发中,debug时经常要用到NSLog输出内容,debug完成后又需要去掉,比较麻烦,内容也不够详细。参考网上资源,扩展NSLog并利用宏替换实现按class打开或关闭的详细的NSLog输出,可以方便使用。

    iOS中控制NSLog输出时机详解

    本文给大家介绍的是iOS开发中关于nslog的输出时机的相关内容,非常简单实用,有需要的小伙伴可以参考下

    iOS小技能:NSLog调试技巧

    文章地址:https://blog.csdn.net/z929118967/article/details/125207599... 1. DEBUG 宏区分调试模式和发布模式进行特殊处理 2. Objective-C's boxing capability (`装箱`快速构造数字对象) 3. benchmarking的时间测量

    OC增删改查

    NSLog(@"%@",str1); //选择删除 NSString *str2=[str substringWithRange:NSMakeRange(0, 3)]; NSLog(@"%@",str2); //添加 NSString *str3=[str1 stringByAppendingString:str2]; NSLog(@"%@",str3); //修改...

    Teleport-NSLog, iOS远程日志记录将NSLog消息发送到后端服务器.zip

    Teleport-NSLog, iOS远程日志记录将NSLog消息发送到后端服务器 传送 nslog 当你的应用程序在用户的设备中运行时,传送NSLog捕获NSLog消息,并将它们发送给指定的后端服务器。 在Xcode中调试时,我们使用NSLog将许多...

    calendarjava源码-LunarCalendarFunctionsInOBJC:从Java源转换为Obj-C中“计算越南农历”的源代码

    to_am: 2 month: 4 year: 2016 TimeZone: 7 ]; NSLog ( @" %@ " , al); NSArray *ngay = [[VCMVietCalendar share ] Ngay_can_chi: 2 Month: 4 Year: 2016 ]; NSLog ( @" ngay: %@ " , ngay); NSArray *thang = [...

    ios-DebugWindow一个在真机上测试时方便查看输出日志的小工具。.zip

    - 重定向NSLog输出日志到文件中,这样你就不用替换到你项目中已有的NSLog()代码啦。 - 重定向程序奔溃日志到文件中。 - 自动根据当前设备信息选择要不要记录日志的同时把日志打印到控制台。 - 方便增删改查当前...

    YQDeviceInfo:iOS设备信息,例如型号,iOS版本,电池电量,CPU,内存

    iOS Device Infomation,like model,ios version,battery level,cpu,memory iOS端 获取设备信息的简单封装 -直接拖到工程中使用 Example Code: 设备型号: NSString *modelSimple = [YQDeviceInfo ...

    ios-三行代码快速将JSON 转换成model.zip

    NSDictionary *dict = data.jsonObject; NodeDetailModel *model = [[NodeDetailModel alloc] initWithDict:dict];...NSLog(@"%@", model); 来源Github: https://github.com/ifnil/CCModel.git

    AppDelegateNotification:IOS7,8 支持通知类

    应用委托通知 プッシュ通知クラス。 IOS7,8対応 安装 ... NSLog(@"Success : Regist to APNS.(%@)", token); } -(void) didFailRegistDeviceToken : (UIApplication *)application error:(NSError *

    iOS下json解析工具

    iOS下解析json数据,自己亲自使用过,挺好用的。 使用JSONKit的解析方法:(需导入包:#import "JSONKit/JSONKit.h") - (void)printJson{ //如果json是“单层”的,即value都是字符串、数字,可以使用...

    CocoaDebug:iOS调试工具:rocket:

    列出应用程序和设备信息,包括:版本,构建,捆绑软件名称,捆绑软件ID ,屏幕分辨率,设备, iOS版本 列出应用程序发送的所有网络请求。 (支持JSON和Google的Protocol buffers ) 列出所有沙箱文件夹和文件,...

Global site tag (gtag.js) - Google Analytics