QAMenu
您是否曾经想要快速
- 在测试您的应用时访问内部调试信息?
- 在您的应用中提供内部快捷方式,例如重置通常不可访问的状态?
- 暴露可用的功能开关并覆盖它们?
- 测试您的崩溃报告员是否仍然有效?
- ...
好吧,在这种情况下,您不再需要担心所需的编码工作量,UI 代码,视图模型等等。
QAMenu 就是来帮您的。它是一个减少数据模型驱动的布局渲染器,专门用于 QAMenus、调试菜单和设置屏幕的用途,这些屏幕不是提供给最终用户的,而是仅用于内部。与系统设置包不同,它直接存在于您的应用中,并且是交互式的。您可以直接检索信息和执行操作。
您可以将它视为您调试菜单的设计系统。
QAMenu 随带一个小目录,其中包含一些非常通用的模型,例如显示应用版本、公开 Info.plist 内容或执行崩溃。尽管其主要重点是提供一个框架,以便您在日常生活中需要时添加自定义调试信息/操作 - 尽可能简单,不必要时不涉及 UI 代码。
足够介绍了。这个演示为您提供了一个预览。您所看到的是 QAMenu 实例。示例中展示的所有内容都是基于几乎无 UI 数据模型结构的。
您可以亲自运行 Examples/Example-iOS
中的示例应用,并选择展示菜单进行尝试。
愿景
QAMenu 基于以下愿景
您的应用中的调试功能应该是团队工作流程的一个基本部分。而不是依赖于临时黑客程序来截获现有的 UI 元素,它们应该对整个团队可访问,永久可访问,并且开发者始终能够快速添加更多,而不用担心没有足够的时间来做这件事。
由此愿景出发,以下原则如下。
查看 原则 以了解每个原则的详细描述。
使用
QAMenu 以独立窗口的形式呈现。它可以通过调用 show()
方法或摇晃设备来打开。
配置可以在应用启动时进行。要创建 QA 菜单,您需要传递菜单结构。大多数数据模型类型都作为 Dynamic<T>
包裹,可以保持普通值、闭包或路径。QAMenu 及其 UI 渲染器仅在需要时解包内容。这实现了实时行为。
通常,QAMenu 可以在 App Delegate 中存储和初始化。
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
// You need to keep a reference to QAMenu, otherwise it will be released from memory
var qaMenu: QAMenu?
...
private func setupQAMenu() {
let groups: [Group] = [
QAMenu.Catalog.AppInfo.group(),
self.cacheGroup,
QAMenu.Catalog.Preferences.group()
]
self.qaMenu = QAMenu(
pane: RootPane(title: .static("Simple Project"), groups: groups),
presenterType: QAMenuUIKitPresenter.self
)
self.qaMenu?.setTrigger([.shake], mode: .initialValue)
}
private var cacheGroup: [Group] {
let group = ItemGroup(title: .static("App Cache"), items: .static([
BoolItem(
title: .static("Enable cache"),
value: .computed({ [weak self] in
return self?.simpleProjectCacheEnabled ?? false
}),
onValueChange: { [weak self] value, _, result in
guard let self = self else {
result(.failure("Object was released from memory"))
return
}
self.simpleProjectCacheEnabled = value
result(.success)
}
),
StringItem(
title: .static("Cached images"),
value: .computed({ [weak self] in
return String(describing: self?.cache.imagesCount ?? 0)
})
),
ButtonItem(
title: .static("Reset image cache"),
action: { [weak self] (item: ButtonItem, _) in
item.status = .progress("Deleting cache")
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
self?.simpleProjectCachedImagesCount = 0
item.status = .idle
item.parentGroup?.invalidate()
}
}
)
]))
return group
}
}
此截图显示了生成的 QAMenu。您还可以在位于 Examples/Example-iOS
的示例应用中找到和使用代码。
路线图
支持的数据类型 - 布局
- 面板(即屏幕/视图控制器)
- 嵌套面板(即子面板)
- 组
- 选择组
支持的数据类型 - 项目
- 字符串(可编辑)
- 按钮
- 布尔值(可编辑)
- 页脚
- 可选择的字符串
- 进度项目
- 步进器项目
- 滑动条项目
功能
- 长按项目以共享它们
- 在面板中搜索
- 项目、组和面板的失效(重新加载)
- 在组中动态添加/删除项目
- 编辑字符串(单行)
- 编辑字符串(多行)
- 异步加载操作(项目)
- 异步加载操作(组)
- 接口以在项目和组上触发对话框
请参阅 数据结构 了解更多详情。
渲染器
- UIKit(针对 iPhone 优化)
- UIKit(针对 iPad 优化)
- SwiftUI(针对 iPhone 优化)
- SwiftUI(针对 iPad 优化)
测试
- 单元测试
- UI 测试
- UI 快照测试
CI
- 在 PR 中运行单元测试
- 在 PR 中编译示例应用
- 在 PR 中执行代码风格检查
- 在 PR 中运行 UI 测试
文档
- README
- 源代码中的文档
- 包含更多详细集成和公共 API 描述的 Wiki
QAMenu 目录
QAMenu提供了独立的框架QAMenuCatalog
,其中包含一些非常基本的调试项。它作为使用示例和这些非常基本的可重复配置的示例。
一些示例截图
查看目录和示例应用程序获取更多详细信息。
安装
CocoaPods
CocoaPods是一个Cocoa项目的依赖项管理器。您可以使用以下命令进行安装:
$ gem install cocoapods
要使用CocoaPods将QAMenu集成到您的Xcode项目中,请在您的Podfile
中指定它。
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '10.0'
use_frameworks!
target '<Your Target Name>' do
pod 'QAMenuUIKit'
end
然后,运行以下命令:
$ pod install
手动集成
要从源代码直接集成QAMenu,请遵循通常的集成步骤。您可以使用Examples/Example-iOS
作为现实生活中的示例。