Code Monkey home page Code Monkey logo

vzinspector's Introduction

VZInspector

VZInspector

Build Status Version License Platform

This project is no longer being actively developed or maintained.

简介

VZInspector 是一个给 iOS 开发者使用的 debug 工具,包含日志查询、取色、控件检查、视觉稿比对等功能,同时提供了丰富的接口方便自行定制。

接入

使用 Cocoapods

pod 'VZInspector'

Pod安装成功后,在AppDelegate.m中引入头文件:

#import "VZInspector/VZInspector.h"

AppDelegate.m中配置VZInspector插件

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
    
    //some code above...

    [VZInspector setClassPrefixName:@"VZ"];
    [VZInspector setShouldHandleCrash:true];
    [VZInspector setShouldHookNetworkRequest:true];
    [VZInspector setLogNumbers:10];
    [VZInspector showOnStatusBar];

    //some code below
}

功能说明

这部分按照 VZInspector 界面上的功能区块,分别介绍 VZInspector 内置的功能以及可自定义的功能。

内存占用

App 当前内存占用显示在 Status 顶部,折线显示内存占用变化趋势。

Dashboard

这里显示一些常用信息,比如 uid、视图栈、特定 UserDefaults 的值等,默认显示设备信息和视图栈,可以通过以下代码自定义该区域内容。点击“R”按钮会重新获取该区域内容。

+ (void)setupVZInspector {
    [VZInspector addObserveCallback:^NSString *{
        //返回需要追加显示的信息
    }];
}

自定义

在 Memory Usage 区域上面有一个自定义区域,供你放置一些开关,例如我们在这里做了环境切换、清理内存缓存的功能,环境切换功能深受测试同学喜欢。自定义示例如下:

//自定义 Dashboard 开关
[VZInspector addDashboardSwitch:@"发布环境" Highlight:productEnv?:NO Callback:^{
    //按钮点击动作
}];

Log

Log 界面显示 NSLog 输出的信息,可以在不连接 Xcode 时直接查看日志,最新的日志在顶部显示。此外顶部提供了过滤功能;右下区域的三个按钮分别对应 回到顶部打开/关闭自动刷新刷新 操作。

自定义

顶部搜索框可以进行简单过滤,为了避免每次输入相同关键词,你可以用下面的代码添加关键词过滤按钮。

//设置 Log 过滤关键词
[VZLogInspector sharedInstance].searchList = @[@"keyword1", @"keyword2"];

设置好的关键词会以按钮形式显示,点击即可显示相应关键词的过滤结果。

Toolbox

Toolbox 界面提供了一些常用小工具,例如网络日志查看、控件检查、帧率监测。开关类的工具在打开时会在右上角显示 ON

Logs

Logs 用来实时查看网络请求的状态、返回等,需要自行配置网关信息,如下所示:

+ (void)setupNetworkMonitorConfig
{
    [VZInspector setShouldHookNetworkRequest:true];
    
    [[VZNetworkInspector sharedInstance] addTransactionTitleFilter:^NSString *(VZNetworkTransaction *transaction) {
        if ([transaction.request.URL.host rangeOfString:@"YourGatewayKeyword"].location != NSNotFound) {
            NSString *operationType = [transaction.request valueForHTTPHeaderField:@"Operation-Type"];
            if (operationType.length == 0) {
                NSData *bodyData = [transaction postBodyData];
                NSString *body = [[NSString alloc] initWithData:bodyData encoding:NSUTF8StringEncoding];
                
                NSString *parten = @"operationType=([a-zA-Z0-9.]*)";
                NSRegularExpression *reg = [NSRegularExpression regularExpressionWithPattern:parten options:kNilOptions error:nil];
                NSTextCheckingResult* match = [reg firstMatchInString:body options:kNilOptions range:NSMakeRange(0, [body length])];
                if (match) {
                    operationType = [body substringWithRange:[match rangeAtIndex:1]];
                }
            }
            if (operationType.length > 0) {
                return operationType;
            }
        }
        return nil;
    }];
    
    [VZNetworkInspector setIgnoreDelegateClasses:[NSSet setWithObjects:@"ClassesYouWantToIgnore", nil]];
}

Crash

可以捕获 App 的 Crash 日志,开启方法:

//打开 crash 捕获
[VZInspector setShouldHandleCrash:YES];

Sandbox

用来展示应用沙盒文件,对于文本和图片文件,点击可以预览。

Grid

网格工具用来做视觉检查,比如简单的控件对齐、控件尺寸等。

Border

边框检查工具能显示当前界面所有控件的边框,可以用来进行视觉检查。此外你可以设置类前缀关键词,比如“O2O”,这样就会将所有“O2O”开头的类的类名显示出来。

//自定义显示类名的控件类前缀
[VZInspector setClassPrefixName:@"O2O"];

Warning

Warning 用来模拟内存警告,可以帮你验证 didReceiveMemoryWarning 里的逻辑,当打开的时候,可以在 “Memory Usage” 区域看到红色闪烁标识。

Image

Image 工具用于检查界面上的图片,比如查看图片尺寸,图片 URL。

工具栏的按钮从左到右依次为:

  • 返回
  • 分享,可以在手机上把当前选择的图片 AirDrop 到电脑上
  • 复制,可以把选择的图片和描述复制到剪切板,再按 Ctrl+C 从模拟器复制出来
  • 切换,点击切换是否开启选择模式,关闭选择模式来操作界面

选择图片后会把图片置顶显示,并显示出被裁剪的部分。
屏幕上方(或下方)显示图片和 View 的尺寸、scale、宽高比,图片帧数。另外 O2O 中额外增加了图片 URL 的显示。

如果点击的位置有多个重叠的图片,可以多次点击来切换选择的图片。

Location

Location 工具用来模拟经纬度,打开开关后输入经纬度即可。界面上也提供了一些常用城市的经纬度。

FrameRate

帧率监测工具可以将帧率显示在状态栏上。注:模拟器无法精准检测帧率,仅在真机上有效。

ColorPicker

提供屏幕取色的功能。

  • 按像素取值,并将颜色展示在下面控制板
  • 拖动底部的slider可以控制放大倍率(5 ~ 30倍)
  • 拖动取色器可以移动取色的位置,在取色器外滑动可以慢速移动,方便按像素取值移动

Plugin

插件界面方便你在 VZInspector 中放置自己开发的插件,如下图所示。这部分完全是业务相关的工具,可以使用下面的代码进行自定义。

//添加自定义插件
VZInspectorToolItem *scan = [VZInspectorToolItem itemWithName:@"scan" icon:icon callback:^{
    //按钮点击动作
}];
[VZInspector addToolItem:scan];

License

VZInspector 基于 MIT License,更多信息查看:https://opensource.org/licenses/MIT

Contribution

欢迎任何建议 & Pull request。

vzinspector's People

Contributors

johnwong avatar pmwy avatar xta0 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

vzinspector's Issues

运行程序直接崩溃

1,新建一个单视图工程
2,新建cocopod
3,加入vzinspector
4,运行工程
5,崩溃

崩溃内容:
2018-02-12 10:54:37.030029+0800 Inspector[18228:2964874] [ApplicationLifecycle] Windows were created before application initialzation completed. This may result in incorrect visual appearance.
2018-02-12 10:54:37.030691+0800 Inspector[18228:2964874] +[CATransaction synchronize] called within transaction
2018-02-12 10:54:37.078381+0800 Inspector[18228:2964874] *** Assertion failure in -[UIApplication _runWithMainScene:transitionContext:completion:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3698.33.6/UIApplication.m:3529
2018-02-12 10:54:37.133128+0800 Inspector[18228:2964874] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Application windows are expected to have a root view controller at the end of application launch'
*** First throw call stack:
(
0 CoreFoundation 0x000000010c37912b __exceptionPreprocess + 171
1 libobjc.A.dylib 0x000000010b2c3f41 objc_exception_throw + 48
2 CoreFoundation 0x000000010c37e2f2 +[NSException raise:format:arguments:] + 98
3 Foundation 0x00000001088fad69 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 193
4 UIKit 0x000000010911d051 -[UIApplication _runWithMainScene:transitionContext:completion:] + 3102
5 UIKit 0x00000001094e66f8 __111-[__UICanvasLifecycleMonitor_Compatability _scheduleFirstCommitForScene:transition:firstActivation:completion:]_block_invoke + 924
6 UIKit 0x00000001098bc4c8 +[_UICanvas _enqueuePostSettingUpdateTransactionBlock:] + 153
7 UIKit 0x00000001094e62f1 -[__UICanvasLifecycleMonitor_Compatability _scheduleFirstCommitForScene:transition:firstActivation:completion:] + 249
8 UIKit 0x00000001094e6b6b -[__UICanvasLifecycleMonitor_Compatability activateEventsOnly:withContext:completion:] + 696
9 UIKit 0x0000000109e64a69 __82-[_UIApplicationCanvas _transitionLifecycleStateWithTransitionContext:completion:]_block_invoke + 262
10 UIKit 0x0000000109e64922 -[_UIApplicationCanvas _transitionLifecycleStateWithTransitionContext:completion:] + 444
11 UIKit 0x0000000109b419c8 __125-[_UICanvasLifecycleSettingsDiffAction performActionsForCanvas:withUpdatedScene:settingsDiff:fromSettings:transitionContext:]_block_invoke + 221
12 UIKit 0x0000000109d40b06 _performActionsWithDelayForTransitionContext + 100
13 UIKit 0x0000000109b4188b -[_UICanvasLifecycleSettingsDiffAction performActionsForCanvas:withUpdatedScene:settingsDiff:fromSettings:transitionContext:] + 231
14 UIKit 0x00000001098bbb25 -[_UICanvas scene:didUpdateWithDiff:transitionContext:completion:] + 392
15 UIKit 0x000000010911b36a -[UIApplication workspace:didCreateScene:withTransitionContext:completion:] + 523
16 UIKit 0x00000001096f6605 -[UIApplicationSceneClientAgent scene:didInitializeWithEvent:completion:] + 369
17 FrontBoardServices 0x00000001110b5cc0 -[FBSSceneImpl _didCreateWithTransitionContext:completion:] + 338
18 FrontBoardServices 0x00000001110be7b5 __56-[FBSWorkspace client:handleCreateScene:withCompletion:]_block_invoke_2 + 235
19 libdispatch.dylib 0x000000010c99633d _dispatch_client_callout + 8
20 libdispatch.dylib 0x000000010c99b9f3 _dispatch_block_invoke_direct + 592
21 FrontBoardServices 0x00000001110ea498 FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK + 24
22 FrontBoardServices 0x00000001110ea14e -[FBSSerialQueue _performNext] + 464
23 FrontBoardServices 0x00000001110ea6bd -[FBSSerialQueue _performNextFromRunLoopSource] + 45
24 CoreFoundation 0x000000010c31c101 CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION + 17
25 CoreFoundation 0x000000010c3bbf71 __CFRunLoopDoSource0 + 81
26 CoreFoundation 0x000000010c300a19 __CFRunLoopDoSources0 + 185
27 CoreFoundation 0x000000010c2fffff __CFRunLoopRun + 1279
28 CoreFoundation 0x000000010c2ff889 CFRunLoopRunSpecific + 409
29 GraphicsServices 0x000000010f79f9c6 GSEventRunModal + 62
30 UIKit 0x000000010911e5d6 UIApplicationMain + 159
31 Inspector 0x0000000107bfb61f main + 111
32 libdyld.dylib 0x000000010ca12d81 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.