效率相关|iOS调试神器--FLEX

FLEX (Flipboard Explorer) 是一系列集成在APP内部的用于iOS调试的工具集,以工具栏的形式显示在应用中,通过它,可以查看并修改几乎所有的APP运行状态。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g3gyNkjz-1598274646340)(https://user-images.githubusercontent.com/8371943/70185687-e842c800-16af-11ea-8ef9-9e071380a462.gif)]
强大的调试能力

  • 查看、修改View的层次关系。
  • 查看对象的属性和实例变量。
  • 动态修改属性和实例变量。
  • 动态调用实例和类方法。
  • 观察详细的网络请求历史记录,包括时间、报头和完整响应。
  • 添加自定义的模拟器快捷键。
  • 查看系统日志消息(例如从NSLog)。
  • 动态访问堆上的对象。
  • 访问APP沙盒中的文件系统。
  • 浏览文件系统中的SQLite/Realm数据库。
  • 在模拟器中使用控制键、shift键和command键触发3D触摸。
  • 探索APP和链接系统框架中的所有类(公共和私有)。
  • 快速访问一些常用的对象,比如 [UIApplication sharedApplication] 、App Delegate、Root View Controller等。
  • 动态查看、修改 NSUserDefaults 存储的值。
和其它调试工具不同,FLEX完全运行在你的APP中,所以不需要连接到LLDB/Xcode或者远程调试的服务端,在模拟器和真机上都运行的很好。
用法 简单方法
// Objective-C [[FLEXManager sharedManager] showExplorer];

// Swift FLEXManager.shared.showExplorer()

完整方法
#if DEBUG #import "FLEXManager.h" #endif...- (void)handleSixFingerQuadrupleTap:(UITapGestureRecognizer *)tapRecognizer { #if DEBUG if (tapRecognizer.state == UIGestureRecognizerStateRecognized) { // This could also live in a handler for a keyboard shortcut, debug menu item, etc. [[FLEXManager sharedManager] showExplorer]; } #endif }

功能示例 修改视图
点击 views ,从工具栏下面弹出界面,显示视图的详细信息,并能修改属性值和调用方法。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IcKW07h6-1598274646347)(https://user-images.githubusercontent.com/8371943/70271816-c5c2b480-176c-11ea-8bf4-2c5a755bc392.gif)]
网络记录
启用后,网络调试允许你查看所有使用NSURLConnection或NSURLSession发出的请求。并且你可以调整要缓存的响应体的类型以及响应缓存的最大大小限制。你可以选择在应用程序启动时自动启用网络调试。此设置会在启动时持久化。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3rdtzXtk-1598274646349)(https://user-images.githubusercontent.com/8371943/70271876-e5f27380-176c-11ea-98ef-24170205b706.gif)]
查看堆栈上的对象
FLEX会查询所有malloc活动分配的内存块,并搜索那些看起来像对象的内存块。你可以从这里看到一切:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jz37esC3-1598274646351)(https://user-images.githubusercontent.com/8371943/70271850-d83cee00-176c-11ea-9750-ee3a479c6769.gif)]
通过地址访问
你可以通过任意的一个地址来访问该地址的对象,如果地址指向有效的对象,你可以直接打开它。如果FLEX不确定这个地址是否指向有效的对象,它会警告并拒绝访问该指针。但是,你仍可以通过"Unsafe Explore"来访问它。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xmh9BbM5-1598274646353)(https://user-images.githubusercontent.com/8371943/70271798-bb081f80-176c-11ea-806d-9d74ac293641.gif)]
模拟键盘快捷键
默认的键盘快捷键允许您激活FLEX工具,使用方向键滚动,以及使用 ESC 键关闭模式。你也可以添加自定义键盘快捷方式通过 -[FLEXManager registerSimulatorShortcutWithKey:modifiers:action:description] 这个方法。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-drsvho5n-1598274646355)(https://user-images.githubusercontent.com/8371943/70272984-d3793980-176e-11ea-89a2-66d187d71b4c.png)]
文件浏览
查看APP沙盒内的文件系统,包括文件大小、图片预览、以友好的方式显示json和plist文件。你可以重命名和删除文件和文件夹,也可以将文本和图片文件拷贝和剪贴板中,并且通过 “share” 来共享任意文件,以方便你在其他应用来打开这些文件。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MbkmhSok-1598274646356)(https://user-images.githubusercontent.com/8371943/70271831-d115e000-176c-11ea-8078-ada291f980f3.gif)]
SQLite浏览器
SQLite数据库文件(以 .db 或者 .sqlite为后缀为结尾的文件 ),或者
Realm数据库文件都可以使用FLEX来浏览。数据库浏览器允许你查看所有表,并通过点击每列的表头进行排序。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-azOY5JoG-1598274646357)(https://user-images.githubusercontent.com/8371943/70271881-ea1e9100-176c-11ea-9a42-01618311c869.gif)]
在模拟器中模拟3D触摸
使用 CMD、CTRL 和 shift 键的组合,您可以在模拟器中模拟不同级别的3D触摸压力。每个键贡献最大力的1/3。注意,你需要稍微移动触摸来获得压力更新。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-149bL55w-1598274646358)(https://cloud.githubusercontent.com/assets/1422245/11786615/5d4ef96c-a23c-11e5-975e-67275341e439.gif)]
探索系统库资源
深挖框架所有公共的和私有的类。如果需要了解有关类的更多信息,可以创建类的实例并研究其默认状态。如果知道要查找的类是哪个类,还可以输入类名直接跳转到该类。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nvg04jtc-1598274646359)(https://user-images.githubusercontent.com/8371943/70271868-dffc9280-176c-11ea-8704-a0c05b75cc5f.gif)]
编辑NSUserDefaults
FLEX允许修改NSUserDefaults的strings, numbers, arrays, and dictionaries,及其它们的组合,输入格式为JSON;如果使用其它数据作为key,如NSDate,则是只读的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CUi8y85F-1598274646360)(https://user-images.githubusercontent.com/8371943/70271889-edb21800-176c-11ea-92b4-71e07d2b6ce7.gif)]
探索其它APP
代码注入留给大家去摸索了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CKwFKJ6n-1598274646361)(https://camo.githubusercontent.com/24e753aa2264303a7d0ed7acc58d072e3ef1c8cd/68747470733a2f2f656e67696e656572696e672e666c6970626f6172642e636f6d2f6173736574732f666c65782f666c65782d726561646d652d726576657273652d312e706e67)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8DvQtj7p-1598274646362)(https://camo.githubusercontent.com/4277b546e62096684b774d415ae2287b3dd936f8/68747470733a2f2f656e67696e656572696e672e666c6970626f6172642e636f6d2f6173736574732f666c65782f666c65782d726561646d652d726576657273652d322e706e67)]
安装
可以通过 CocoaPods Carthage Buck 以及 手动添加到项目中,具体细节看 github即可
避免将FLEX编译到正式版本 尽管FLEX很适合在开发调试的时候使用,但它不应该让最终用户看到。在Xcode –> Project –> Build Setting,点 + 选择 Add User-Defined Setting
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YcNF2Djn-1598274646363)(https://camo.githubusercontent.com/5b1cbb5cb14496ee12a8a8aeacc2c155a735a1c1/687474703a2f2f656e67696e656572696e672e666c6970626f6172642e636f6d2f6173736574732f666c65782f666c65782d726561646d652d6578636c7564652d312e706e67)]
命名为 EXCLUDED_SOURCE_FILE_NAMES ,在 Release 配置中,填入 FLEX* ,将不会编译所有以FLEX开头的文件, Debug 配置里空白就行了。
【效率相关|iOS调试神器--FLEX】[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IYFTKeev-1598274646364)(https://camo.githubusercontent.com/843997bca76f737561e1084293e9dfd90cda4d97/687474703a2f2f656e67696e656572696e672e666c6970626f6172642e636f6d2f6173736574732f666c65782f666c65782d726561646d652d6578636c7564652d322e706e67)]
在所有集成FLEX代码的地方,确保将其嵌入到 #if DEBUG 中,更多相关信息,请参考官方示例。
注意
  • NSUserDefaults中,如果值的类型为 id ,FLEX将把输入的string转为json,目的是使用strings, numbers, arrays, and dictionaries的组合。如果值为string,则一定用字符串引号包裹起来,显示使用 NSString 的属性和实例变量,则不用引号。
  • 在使用FLEX时,你可能会取消异常断点。FLEX会产生一些异常,当接收了某种不能处理的输入(如 NSGetSizeAndAlignment() ), 为了防止程序崩溃,FLEX会捕获并将其抛出。如果你开启了断点,则会进入断点中。

    推荐阅读