FLEX (Flipboard Explorer) 是一系列集成在APP内部的用于iOS调试的工具集,以工具栏的形式显示在应用中,通过它,可以查看并修改几乎所有的APP运行状态。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g3gyNkjz-1598274646340)(https://user-images.githubusercontent.com/8371943/70185687-e842c800-16af-11ea-8ef9-9e071380a462.gif)]
[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数据库文件(以 .db
或者 .sqlite
为后缀为结尾的文件 ),或者
Realm数据库文件都可以使用FLEX来浏览。数据库浏览器允许你查看所有表,并通过点击每列的表头进行排序。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-azOY5JoG-1598274646357)(https://user-images.githubusercontent.com/8371943/70271881-ea1e9100-176c-11ea-9a42-01618311c869.gif)]
使用 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)]
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)]
代码注入留给大家去摸索了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CKwFKJ6n-1598274646361)(https://camo.githubusercontent.com/24e753aa2264303a7d0ed7acc58d072e3ef1c8cd/68747470733a2f2f656e67696e656572696e672e666c6970626f6172642e636f6d2f6173736574732f666c65782f666c65782d726561646d652d726576657273652d312e706e67)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8DvQtj7p-1598274646362)(https://camo.githubusercontent.com/4277b546e62096684b774d415ae2287b3dd936f8/68747470733a2f2f656e67696e656572696e672e666c6970626f6172642e636f6d2f6173736574732f666c65782f666c65782d726561646d652d726576657273652d322e706e67)]
可以通过 CocoaPods Carthage Buck 以及 手动添加到项目中,具体细节看 github即可
尽管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
配置里空白就行了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IYFTKeev-1598274646364)(https://camo.githubusercontent.com/843997bca76f737561e1084293e9dfd90cda4d97/687474703a2f2f656e67696e656572696e672e666c6970626f6172642e636f6d2f6173736574732f666c65782f666c65782d726561646d652d6578636c7564652d322e706e67)]
在所有集成FLEX代码的地方,确保将其嵌入到 #if DEBUG
中,更多相关信息,请参考官方示例。
id
,FLEX将把输入的string转为json,目的是使用strings, numbers, arrays, and dictionaries的组合。如果值为string,则一定用字符串引号包裹起来,显示使用 NSString
的属性和实例变量,则不用引号。NSGetSizeAndAlignment()
), 为了防止程序崩溃,FLEX会捕获并将其抛出。如果你开启了断点,则会进入断点中。