tipkit 是做什么的?
使用 Apple 的 TipKit 框架实现、审查或改进应用内提示和引导流程。适用于添加功能发现提示、引导流程、上下文提示、首次运行体验、操作指引,或处理 Tip 协议、TipView、popoverTip、提示规则、提示事件及功能教育 UI。
概述
dpearson2699/tipkit 技能提供使用 Apple 的 TipKit 框架在应用内实现功能发现提示、引导流程和上下文提示的指导。涵盖从定义 Tip 协议到使用 TipView 和 popoverTip 展示 UI 的所有内容,包括提示规则和提示事件。
适用场景
当任务涉及以下方面时,使用此技能:
- 添加功能发现提示(如“试试此新功能!”)
- 实现引导流程(如使用 TipView 或 popoverTip 的分步提示)
- 创建上下文提示(基于特定操作或条件显示)
- 设计首次运行体验的提示
- 在现有代码中审查或调试提示实现
- 设置提示规则(如限制显示频率或基于条件显示)
- 配置提示事件(如用户完成操作后触发提示)
平台支持
- iOS 17.0+
- macOS 14.0+
- tvOS 17.0+
- watchOS 10.0+
主要组成部分
1. 定义 Tip
通过遵循 Tip 协议创建提示:
struct NewFeatureTip: Tip {
var title: Text {
Text("开始新功能")
}
var message: Text? {
Text("探索我们全新的排版方式,更易组织内容。")
}
var image: Image? {
Image(systemName: "star.fill")
}
}
2. 展示 Tip
使用 TipView 或 popoverTip 修饰符:
struct ContentView: View {
static let newFeatureTip = NewFeatureTip()
var body: some View {
VStack {
// 嵌入视图中的提示
TipView(Self.newFeatureTip)
// 或作为弹出提示
Button("操作") { }
.popoverTip(Self.newFeatureTip)
}
}
}
3. 提示规则
控制提示的显示方式:
struct ConditionalTip: Tip {
@Parameter
static var shouldShow: Bool = false
var title: Text {
Text("条件提示")
}
var rules: [Rule] {
#Rule(Self.$shouldShow) { $0 == true }
}
}
4. 提示事件
基于用户操作触发提示:
struct EventDrivenTip: Tip {
static let didCompleteAction = Event(id: "didCompleteAction")
var title: Text {
Text("干得好!")
}
var rules: [Rule] {
#Rule(Self.didCompleteAction) { $0.donations.count >= 3 }
}
}
5. 重置提示
在 Xcode Previews 或测试中:
import TipKit
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
.task {
try? Tips.resetAll()
}
}
}
最佳实践
- 上下文相关:仅在相关时显示提示(避免干扰或混淆)
- 简洁:提示应简短且可操作
- 可关闭:确保用户能轻松关闭提示
- 频率限制:使用提示规则限制显示频率
- 事件驱动:用提示事件在正确时机触发提示
- 可访问性:确保提示与 VoiceOver 兼容,不影响导航
常见陷阱
- 过度提示:避免同一时间内显示过多提示
- 过时提示:用户熟悉功能后隐藏提示
- UI 阻塞:提示不应阻止用户与应用交互
- 规则冲突:确保提示规则不冲突导致意外行为
- 事件管理:避免多事件提示导致显示不一致
示例项目
使用此技能开发完整示例时,推荐包含:
- 从
Tip协议定义的操作提示 - 使用
TipView或popoverTip展示 - 基于规则或事件的提示控制逻辑
故障排除
- 提示不显示:检查框架是否以
.tipsEnabled()配置,验证规则和事件条件 - 重复显示:检查冷却期或事件捐赠条件
- 布局问题:确认
TipView在父视图中获得足够空间
配置
import TipKit
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
.task {
// 配置提示配置
try? Tips.configure([
.displayFrequency(.immediate),
.datastoreLocation(.applicationDefault)
])
}
}
}
}
调试
- 对特定提示使用
.tipViewStyle(.miniTip)预览样式 - 使用
Tips.resetAll()重置测试提示状态 - 检查控制台输出中的
[TipKit]日志消息