Community-maintained Agent Skills for complete Swift and Apple-platform app delivery.
89%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Medium
Suggest reviewing before use
Use TipKit for small, contextual feature-discovery moments: inline tips, popover tips, rule-gated education, and lightweight coach marks. Keep generic SwiftUI navigation, layout, and long first-run onboarding flows in their sibling skills.
Core TipKit (Tip, TipView, popoverTip, rules, events) is iOS 17+. Gate iOS 18+ APIs (TipGroup, .cloudKitContainer, MaxDisplayDuration) and iOS 26+ APIs (resetEligibility()) explicitly.
Call Tips.configure(_:) once during app startup in init() or application(_:didFinishLaunchingWithOptions:):
import SwiftUI
import TipKit
@main
struct MyApp: App {
init() {
do {
try Tips.configure([
.datastoreLocation(.applicationDefault),
.displayFrequency(.daily)
])
} catch {
assertionFailure("TipKit configuration failed: \(error)")
}
}
var body: some Scene {
WindowGroup { ContentView() }
}
}For app groups sharing tip state, use .groupContainer(identifier:). On iOS 18+, sync tip state across devices by adding .cloudKitContainer(.named("iCloud.com.example.tips")).
Create tips by conforming to the Tip protocol:
struct BookmarkTip: Tip {
var title: Text { Text("Save for Later") }
var message: Text? { Text("Tap to bookmark your favorite articles.") }
var image: Image? { Image(systemName: "bookmark") }
@Parameter
static var hasViewedArticle: Bool = false
static let bookmarkEvent = Event(id: "didBookmarkArticle")
var rules: [Rule] {
#Rule(Self.$hasViewedArticle) { $0 == true }
#Rule(Self.bookmarkEvent) { $0.donations.count < 3 }
}
var actions: [Action] {
Action(id: "learn-more", title: "Learn More") {
// Action handler
}
}
}Present tips inline within layouts or anchored as popovers:
// Inline presentation
TipView(BookmarkTip(), arrowEdge: .bottom)
// Popover presentation anchored to a control
Button("Bookmark", systemImage: "bookmark") {
saveBookmark()
BookmarkTip.bookmarkEvent.donate()
}
.popoverTip(BookmarkTip(), arrowEdge: .top)Invalidate tips when the user completes the taught action: BookmarkTip().invalidate(reason: .actionPerformed).
#Rule(Self.$param)): Persistent state flags representing user characteristics or settings.Event(id:)): Track user interactions. Donate via event.donate(). Use #Rule(event) { $0.donations.count == 0 } for frequency or completion gating.Coordinate multiple tips without cluttering the screen. Store TipGroup in @State:
struct OnboardingView: View {
@State private var tips = TipGroup(.ordered) {
WelcomeTip()
SearchTip()
FilterTip()
}
var body: some View {
VStack {
TipView(tips.currentTip)
ContentView()
}
}
}Use testing overrides only in debug builds, before calling Tips.configure():
#if DEBUG
if ProcessInfo.processInfo.arguments.contains("--reset-tips") {
try? Tips.resetDatastore()
}
if ProcessInfo.processInfo.arguments.contains("--show-all-tips") {
Tips.showAllTipsForTesting()
}
#endif
try Tips.configure()Launch arguments: -com.apple.TipKit.ResetDatastore 1, -com.apple.TipKit.ShowAllTips 1.
Tips.configure() in onAppear races with view layout and can throw datastore errors. Configure in app init().showAllTipsForTesting() bypasses display rules. Keep overrides behind #if DEBUG.TipGroup, .cloudKitContainer, and MaxDisplayDuration with #available(iOS 18, *).id properties, TipKit cannot track persistence and invalidation correctly.Tips.configure(_:) invoked once at app launch before any tip displaysTipGroup, CloudKit container) guarded with availability checksTipGroup stored in @State when sequencing related tips.tessl-plugin
skills
accessorysetupkit
references
activitykit
adattributionkit
references
alarmkit
references
app-clips
app-intents
app-store-optimization
app-store-review
apple-on-device-ai
appmigrationkit
audioaccessorykit
references
authentication
references
avfoundation-audio
references
avkit
background-processing
references
browserenginekit
callkit
references
carplay
cloudkit
contacts-framework
references
core-bluetooth
references
core-data
core-haptics
references
core-motion
references
core-nfc
references
coreml
references
cryptokit
cryptotokenkit
debugging-instruments
device-integrity
references
energykit
references
eventkit
family-controls
references
financekit
focus-engine
gamekit
git-branching-workflow
references
healthkit
references
homekit
references
ios-accessibility
ios-app-workflow
references
ios-ettrace-performance
ios-localization
ios-memgraph-analysis
ios-networking
ios-simulator
references
metrickit
references
musickit
references
natural-language
paperkit
references
passkit
references
pdfkit
pencilkit
references
permissionkit
references
photokit
push-notifications
quicklook
references
realitykit
references
relevancekit
references
scenekit
sensorkit
shazamkit
references
speech-recognition
references
spritekit
storekit
swift-api-design-guidelines
swift-architecture
references
swift-charts
swift-codable
references
swift-code-review
swift-concurrency
swift-formatstyle
references
swift-language
swift-security
references
swift-testing
swiftdata
swiftlint
swiftui-animation
swiftui-gestures
references
swiftui-layout-components
swiftui-liquid-glass
references
swiftui-patterns
swiftui-performance
swiftui-responsive-layout
swiftui-uikit-interop
swiftui-webkit
tabletopkit
tipkit
vision-framework
weatherkit
references