FLEX-SocketRocket 0.1.1

FLEX-SocketRocket 0.1.1

测试已测试
Lang语言 Obj-CObjective C
许可证 BSD
发布上次发布2017年7月

Carles Roig 维护。




FLEX (翻页探查器) 是一组用于 iOS 开发的应用程序内调试和探索工具。当显示时,FLEX 在您应用程序窗口上方显示一个工具栏。通过此工具栏,您可以查看和修改运行中的应用程序中的几乎每一部分状态。

Socket Rocket 插件增加了使用 SocketRocket 库来跟踪发送或接收 WebSocket 消息的功能。

View Hierarchy Exploration

赋予自己调试超级能力

  • 检查和修改分层中的视图。
  • 查看任何对象的属性和 ivars。
  • 动态修改许多属性和 ivars。
  • 动态调用实例和类方法。
  • 详细观察时间、头部和完整响应的网络请求历史。
  • 详细探索 SocketRocket 推送通知。
  • 添加自己的模拟器键盘快捷键。
  • 查看系统日志消息(例如来自 NSLog)。
  • 通过堆扫描访问任何活动对象。
  • 查看您应用程序沙盒中的文件系统。
  • 在文件系统中浏览 SQLite/Realm 数据库。
  • 使用控制、shift 和命令键在模拟器中触发 3D touch。
  • 探索应用程序和链接系统框架中的所有类(公共和私有)。
  • 快速访问如 [UIApplication sharedApplication]、应用代理、主窗口上的根视图控制器等有用的对象。
  • 动态查看和修改 NSUserDefaults 值。

与其他许多调试工具不同,FLEX 完全在您应用程序内部运行,所以您不需要连接到 LLDB/Xcode 或不同的远程调试服务器。它在模拟器和物理设备上运行良好。

使用方法

在 iOS 模拟器中,您可以使用键盘快捷键来激活 FLEX。按 f 键可切换 FLEX 工具栏。按 ? 键获取完整快捷键列表。您还可以通过编程方式显示 FLEX

简短版本

[[FLEXManager sharedManager] 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
}

功能示例

修改视图

选择一个视图后,您可以点击工具栏下面的信息栏来显示有关视图的更多详细信息。从这里,您可以修改属性并调用方法。

View Modification

网络历史

当启用网络调试时,您可以使用 NSURLConnection 或 NSURLSession 查看所有发出的请求。设置允许您调整哪些类型的响应体被缓存,以及响应缓存的最大尺寸限制。您可以选择在启动应用程序时自动启用网络调试。此设置在启动之间保持一致。

Network History

SocketRocket 历史

当启用网络历史记录时,来自 socket 的推送将在事务列表中列出。推送通知用铃铛标记。除了时间戳和大小,还显示了 Socket URL 以便于识别。此外,如果控制器中实现了 WebSocket,还会显示代理类名称以过滤来自不同类的通知。

Socket History

堆上所有对象

FLEX 会为所有活动的内存分配块查询 malloc 并搜索外观类似于对象的那些。您可以从这里看到一切。

Heap Exploration

模拟器键盘快捷键

默认键盘快捷键允许您激活 FLEX 工具,使用箭头键进行滚动,并使用回车键关闭模态窗口。您还可以通过 -[FLEXMananger registerSimulatorShortcutWithKey:modifiers:action:description] 添加自定义键盘快捷键。

Simulator Shortcuts

文件浏览器

在您的应用程序沙盒中查看文件系统。FLEX 会显示文件大小、图像预览,并以美观的格式显示 .json.plist 文件。如果您想在应用程序外部检查它们,可以将文本和图像文件复制到剪贴板。

File Browser

SQLite 浏览器

可以使用 FLEX 探索 SQLite 数据库文件(扩展名为 .db.sqlite)或 Realm 数据库文件。数据库浏览器允许您查看所有表,并且可以通过轻击列标题对单个表进行排序。

Database Browser

模拟器中的 3D Touch

通过组合命令、控制、和 Shift 键,您可以在模拟器中模拟不同级别的 3D Touch 压力。每个键贡献最大可能力量的 1/3。请注意,您需要稍微移动触摸以获取压力更新。

Simulator 3D Touch

系统库探索

挖取所有公开和私有事物。要了解更多关于一个类的信息,您可以创建其实例,然后探索其默认状态。

System Libraries Browser

NSUserDefaults 编辑

FLEX 允许您编辑任何组合的字符串、数字、数组和字典。输入被解析为 JSON。如果为默认键设置了其他类型的对象(例如,NSDate),您可以查看它们但不能编辑它们。

NSUserDefaults Editor

从其他应用程序中学习

代码注入留给读者作为练习。😇

Springboard Lock Screen Springboard Home Screen

安装

FLEX 可在 CocoaPods 上使用。只需将以下行添加到您的 podfile

pod 'FLEX', '~> 2.0', :configurations => ['Debug']

或者,您可以将 Classes/ 中的文件手动添加到您的 Xcode 项目中。FLEX 需要 iOS 7 或更高版本。

从发布(App Store)构建中排除 FLEX

FLEX 可以轻松探索您应用的内部结构,因此它不是您应该提供给用户的内容。幸运的是,从发布构建中排除 FLEX 文件很容易。策略取决于您在项目中如何集成 FLEX,以下将进行描述。

在您的代码中集成 FLEX 的位置,进行 #if DEBUG 检查以确保工具仅可在您的 Debug 构建中访问,并避免在 Release 构建中产生错误。有关集成 FLEX 的更多帮助,请查阅示例项目。

手动添加到项目中的 FLEX 文件

在 Xcode 中,转到您项目的“构建设置”选项卡。点击加号,选择 添加用户自定义设置

Add User-Defined Setting

将设置命名为 EXCLUDED_SOURCE_FILE_NAMES。对于您的 Release 配置,将值设置为 FLEX*。这将排除所有以 FLEX 为前缀的文件。在您的 Debug 配置中为值留空。

EXCLUDED_SOURCE_FILE_NAMES

其他说明

  • 当设置 id 类型的字段或在 NSUserDefaults 中的值时,FLEX 会尝试将输入字符串解析为 JSON。这允许您使用字符串、数字、数组和字典的组合。如果您想设置一个字符串值,它必须用引号括起来。对于明确设置为 NSString 类型的 ivars 或属性,不需要引号。
  • 您可能想要在使用 FLEX 时禁用异常断点。某些 FLEX 使用的函数在接收到无法处理的输入时会抛出异常(例如 NSGetSizeAndAlignment())。FLEX 捕获这些异常以避免崩溃,但如果断点处于活动状态,您的断点将被命中。

感谢 & 致谢

FLEX 是基于之前的开源工具的理念和灵感构建的。以下资源特别有帮助

  • DCIntrospect:iOS 模拟器的视图层次结构调试。
  • PonyDebugger:使用 Chrome 开发者工具界面进行网络、核心数据和视图层次结构调试。
  • Mike Ash:关于 obj-c 以及更多内容的优质、信息丰富的博客文章。以下链接对本项目非常有用
  • MAObjCRuntime
  • 键值编码构建
  • ARM64 与您
  • RHObjectiveBeagle:一个堆扫描活对象的工具。需要注意的是,由于许可问题,未查阅 RHObjectiveBeagle 的源代码。
  • heap_find.cpp:枚举 malloc 块以在堆中查找对象的示例。
  • Gist from @samdmarshall:枚举 malloc 块的另一个示例。
  • 非指针 isa:iOS 中 isa 字段更改的解释以及有用的 objc_debug_isa_class_mask 变量的提及。
  • GZIP:用于使用 libz 在 iOS 上压缩/解压缩数据的库。
  • FMDB:这是围绕 SQLite 的 Objective-C 封装

贡献

请参阅我们的贡献指南

待办事项

  • Swift运行时内省(Swift类、堆上的Swift对象等)
  • 改进文件类型在文件浏览器中的检测和显示
  • 动态添加新的NSUserDefault键/值对