Use when implementing, reviewing, or scaffolding Apple platform capabilities beyond core UI, especially WidgetKit, App Intents and Shortcuts, Live Activities, ActivityKit and Dynamic Island, notifications, background tasks, App Clips, StoreKit 2, universal links, Handoff, extensions, or Focus Filters across iOS, iPadOS, macOS, and watchOS. Do not use for basic app architecture or general SwiftUI layout work.
Purpose. This Skill packages best practices and scaffolds for Apple platform features so Claude can generate production-ready widget implementations, App Intents, Live Activities, notifications, background work, commerce flows, and extensions, while keeping you in control of entitlements, Info.plist, and review-readiness.
Contents
This Skill follows the Claude Agent Skills format: a self-contained folder with a SKILL.md manifest,
supporting scripts, templates, and examples designed to be invoked by the model when relevant to your task.
It is optimized for rapid scaffolding and accurate configuration of Apple platform features.
What you get
Prereqs
Apple platform capabilities evolve every year at WWDC and again with the fall OS release. To avoid using obsolete APIs or missing new functionality, always verify current capabilities before implementing. The guidelines below outline a repeatable research routine.
For each feature you plan to use, run targeted web searches with the desired iOS version/year to understand the latest capabilities and limitations:
web_search("WidgetKit iOS [target] new features")web_search("WidgetKit [current year] limitations")web_search("App Intents iOS [version] updates")web_search("App Shortcuts [year] gallery guidelines")web_search("ActivityKit iOS [version] capabilities")web_search("Dynamic Island [year] design guidelines")web_search("StoreKit 2 [year] API changes")web_search("App Store commerce updates [year]")web_search("UNNotification iOS [version] features")web_search("Push notification limits [year]")Platform frameworks receive major updates in June (WWDC) and are finalized during the fall OS release. To stay current:
Apple’s 2025 developer conference introduced substantial updates across platform features. Key highlights include:
glassBackgroundEffect(in:displayMode:) APIs【660665604876454†L40-L119】.#SnippetIntent, @IndexedEntity, and IntentValueQuery allow you to index entities for search, create generative snippets, and offer dynamic options in Siri and Spotlight【660665604876454†L40-L119】. Always verify which macros ship in your target OS and add the necessary @available guards.AppIntentTimelineProvider and parameterized intents when targeting iOS 19 or later.Whenever you integrate these features, run updated searches (e.g., web_search("Liquid Glass iOS 19 design")) to retrieve the latest docs and sample code. The rest of this Skill has not yet been fully revised for iOS 19/26, so treat examples as guidance and consult current WWDC materials before coding.
Last verified: 2025‑10‑28 (covering iOS 17–19).
Next update needed: after WWDC 2026 (expected iOS 20). Update frequency: at least annually.
| Feature | iOS 16 | iOS 17 | iOS 18 | iOS 19 | Notes |
|---|---|---|---|---|
| Interactive Widgets | Limited | Full | Enhanced | Parameterized & glass | iOS 18 adds push‑triggered reloads via WidgetPushHandler; iOS 19 introduces interactive parameters via App Intents and Liquid Glass styling【924387249390674†screenshot】. |
| Live Activities | Basic | Expanded | Enhanced | Scheduled & multi‑device | iOS 18 introduced improved payloads; iOS 19 allows scheduled start times and display on Mac/CarPlay【878419748504667†screenshot】. Broadcast updates to subscribers via ActivityKit channels (watchOS support)【878419748504667†screenshot】. |
| App Intents | Basic | Enhanced | Expanded | Snippets & indexing | iOS 18 introduces SnippetIntent, IndexedEntity, IntentValueQuery; iOS 19 expands with generative snippets and additional domains【868333587505233†screenshot】. |
| StoreKit 2 | Basic | Improved | Enhanced | Unchanged | Use SubscriptionStoreView and custom control styles; iOS 19 brings minor improvements in server‑driven offers【587056330330254†screenshot】. |
| Notifications | Basic | Expanded | Enhanced | Minor | iOS 18 introduced offline queue store and collapsed APNs headers; iOS 19 includes minor reliability enhancements【888881087539299†screenshot】. |
| Background Tasks | Refresh & processing | Same | New continuous tasks | Same | iOS 18 introduces BGContinuedProcessingTask; no major updates in iOS 19【788056121693748†screenshot】. |
| App Clips | Basic | Improved | Enhanced | Same | iOS 18 allows demo versions up to 100 MB with auto‑generated URLs; iOS 19 retains these limits【482897523063529†screenshot】. |
Note: This table is a snapshot. Always verify the actual availability using the search routine above for your target OS.
The following limitations apply as of the iOS 17–18 era. Check for updates each year:
WidgetPushHandler to request reloads. Frequent reloads may be throttled.AppEntity and IntentValueQuery for discovery【868333587505233†screenshot】.BGContinuedProcessingTask, the system can terminate long‑running tasks for resource reasons【788056121693748†screenshot】.apns-collapse-id; offline queue stores multiple pushes per bundle ID but may delay delivery【888881087539299†screenshot】.Use this Skill whenever you want Claude to:
Avoid when you only need a single snippet and no cross-feature planning.
Use this quick matrix to decide which features to implement first:
| Goal | Consider | Why | Cost |
|---|---|---|---|
| Glanceable status | WidgetKit | Persistent presence; low-friction re-engagement | Low |
| Time-bounded, real-time | Live Activity (ActivityKit) | Lock Screen + Dynamic Island visibility | Medium |
| Voice/automation entry points | App Intents & Shortcuts | Spotlight/Siri/Shortcuts discoverability | Low |
| Repeated background refresh | BGTaskScheduler | Reliable refresh without foreground app | Medium |
| 1-tap lightweight flow | App Clip | On-demand, tiny footprint, link/NFC launch | Medium |
| Monetization | StoreKit 2 | Native, on-device purchases/subscriptions | Medium–High |
| Deep navigation from web | Universal Links | Trustworthy app-site redirect | Low |
| Cross-device continuation | Handoff | Resume context across Apple devices | Low |
| Sharing into your app | Share/Action Extensions | Ubiquitous content ingest points | Low–Medium |
| Watch engagement | Complications | Always-visible bite-sized data | Medium |
TimelineProvider (or AppIntentTimelineProvider for configurable widgets).swift/widgets/WeatherWidget.swift)import WidgetKit
import SwiftUI
struct WeatherEntry: TimelineEntry {
let date: Date
let temperature: Int
}
struct Provider: TimelineProvider {
func placeholder(in context: Context) -> WeatherEntry { .init(date: .now, temperature: 72) }
func getSnapshot(in context: Context, completion: @escaping (WeatherEntry) -> Void) {
completion(.init(date: .now, temperature: 72))
}
func getTimeline(in context: Context, completion: @escaping (Timeline<WeatherEntry>) -> Void) {
let now = Date()
let entries = (0..<5).map { offset in
WeatherEntry(date: Calendar.current.date(byAdding: .hour, value: offset, to: now)!, temperature: 60 + offset)
}
completion(Timeline(entries: entries, policy: .atEnd))
}
}
struct WeatherWidgetEntryView: View {
var entry: WeatherEntry
var body: some View { Text("\(entry.temperature)°") }
}
iOS 17 introduced interactive widgets, allowing Button and Toggle controls to perform lightweight actions directly from the widget. iOS 18 builds on this foundation:
WidgetPushHandler to receive WidgetKit push notifications and request timeline reloads on demand【924387249390674†screenshot】.WidgetAccentedRenderingMode and widgetAccentable() to specify glass or paper textures and accent colors on iPhone, iPad and Vision Pro【924387249390674†screenshot】.ControlWidgetButton or ControlWidgetToggle to surface actions in Control Center or the Lock Screen【924387249390674†screenshot】.circular or roundedSquare style【129841997161452†screenshot】.LevelOfDetail to look great in spatial computing【924387249390674†screenshot】.RelevanceConfiguration and AppIntentConfiguration to let people adjust a watchOS widget’s relevance and behavior【924387249390674†screenshot】.Placeholder renders in the gallery; snapshot renders in-app previews; timeline drives the actual updates.
Use .after(Date) or .atEnd depending on whether you can compute the next update time.
For event-driven updates, call WidgetCenter.shared.reloadTimelines(ofKind:) from the host app after background refresh.
Tip: For Intent-configurable widgets, prefer AppIntentTimelineProvider and ConfigurationAppIntent.
Common families: .systemSmall, .systemMedium, .systemLarge, .systemExtraLarge (iPad/macOS), and accessory variants on Apple Watch.
Design for density: the smaller the family, the fewer text lines and the bolder the numbers. Provide previews per family.
AppIntents to your app/extension.AppIntent type with @Parameter properties.@MainActor and include a static var title/description.swift/app_intents/AddTaskIntent.swift)import AppIntents
struct AddTaskIntent: AppIntent {
static var title: LocalizedStringResource = "Add Task"
static var description = IntentDescription("Create a task with priority and due date.")
@Parameter(title: "Title") var titleText: String
@Parameter(title: "Priority") var priority: Int
@Parameter(title: "Due", default: Date.now.addingTimeInterval(3600)) var due: Date
static var parameterSummary: some ParameterSummary {
Summary("Add \(\$titleText) priority \(\$priority) due \(\$due)")
}
func perform() async throws -> some IntentResult {
// Persist to your model
return .result(value: "Task added: \(titleText)")
}
}
iOS 18 significantly expands the App Intents framework:
SnippetIntent to display an interactive snippet in Siri or Spotlight【868333587505233†screenshot】.AppEntity types as IndexedEntity and use @Property(indexingKey:) or @ComputedProperty(indexingKey:) to make them discoverable in Spotlight【868333587505233†screenshot】.IntentValueQuery【868333587505233†screenshot】.Transferable and associate them with a NSUserActivity’s appEntityIdentifier to surface onscreen content to Siri【868333587505233†screenshot】.CameraCaptureIntent) and audio capture (AudioRecordingIntent) to surface actions in Siri, Control Center and Lock Screen【868333587505233†screenshot】.AppEntity to back-selectable items (e.g., Task, Project). Implement Query to fetch/suggest entities.@Parameter(.intent) with validation to guard against invalid input.ActivityAttributes and ContentState.Activity.request(...) from the app, or remotely via push.swift/live_activities/PizzaDeliveryLiveActivity.swift)import ActivityKit
import WidgetKit
import SwiftUI
struct PizzaDeliveryAttributes: ActivityAttributes {
public struct ContentState: Codable, Hashable {
var minutesRemaining: Int
var stage: String
}
var orderNumber: String
}
// Requires iOS 17+ for interactive Live Activity features.
@available(iOS 17.0, *)
struct PizzaDeliveryLiveActivity: Widget {
var body: some WidgetConfiguration {
ActivityConfiguration(for: PizzaDeliveryAttributes.self) { context in
VStack {
Text("Order #\(context.attributes.orderNumber)")
Text("\(context.state.minutesRemaining)m • \(context.state.stage)")
}
} dynamicIsland: { context in
DynamicIsland {
DynamicIslandExpandedRegion(.leading) { Text("⏱") }
DynamicIslandExpandedRegion(.center) { Text("\(context.state.minutesRemaining)m") }
DynamicIslandExpandedRegion(.trailing) { Text(context.state.stage) }
} compactLeading: {
Text("⏱")
} compactTrailing: {
Text("\(context.state.minutesRemaining)m")
} minimal: {
Text("\(context.state.minutesRemaining)")
}
}
}
}
iOS 17 enhanced ActivityKit with remote scheduling and watchOS integration, and iOS 18 takes Live Activities further:
Activity.request(attributes:content:pushType:style:alertConfiguration:start:) to schedule an activity to begin at a future time【878419748504667†screenshot】.ActivityAuthorizationInfo() to check availability and state.Activity.pushTokenUpdates and send updates through your server.UNUserNotificationCenter.swift/notifications/NotificationsManager.swift)import UserNotifications
import UIKit
final class NotificationsManager: NSObject, UNUserNotificationCenterDelegate {
func requestAuthorization() async throws {
let center = UNUserNotificationCenter.current()
try await center.requestAuthorization(options: [.alert, .badge, .sound, .provisional])
await MainActor.run { UIApplication.shared.registerForRemoteNotifications() }
center.delegate = self
}
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification) async -> UNNotificationPresentationOptions {
[.banner, .sound]
}
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse) async {
// Route based on actionIdentifier
}
}
UNNotificationAttachment) and a content extension to render custom UI.apns-collapse-id header to allow multiple pushes to be collapsed into a single notification for efficiency【888881087539299†screenshot】.application(_:didFinishLaunching:).swift/background_tasks/BackgroundTasks.swift)import BackgroundTasks
enum BGIdentifiers {
static let refresh = "com.example.app.refresh"
static let processing = "com.example.app.processing"
}
func registerBackgroundTasks() {
BGTaskScheduler.shared.register(forTaskWithIdentifier: BGIdentifiers.refresh, using: nil) { task in
scheduleAppRefresh()
Task { await refreshData(); task.setTaskCompleted(success: true) }
}
}
BGContinuedProcessingTask (continuous background tasks) to allow critical work to continue after your app goes to the background【788056121693748†screenshot】. Use this when a process such as training an ML model or processing photos must run for an extended time.BGTaskScheduler.debugLog() for insights.swift/app_clip/AppClipSample.swift)import SwiftUI
@main
struct AppClipSample: App {
var body: some Scene {
WindowGroup {
ContentView()
.onOpenURL { url in /* route lightweight flow */ }
}
}
}
Product.products(for:) to fetch; product.purchase() to buy.Transaction.updates and verify with Transaction.currentEntitlements.swift/storekit/StoreKit2Purchase.swift)import StoreKit
@MainActor
final class Store: ObservableObject {
@Published var products: [Product] = []
@Published var purchasedIDs: Set<String> = []
func load() async throws {
products = try await Product.products(for: ["pro_monthly", "pro_yearly"])
for await result in Transaction.currentEntitlements {
if case .verified(let t) = result { purchasedIDs.insert(t.productID) }
}
}
func buy(_ product: Product) async throws {
let result = try await product.purchase()
if case .success(let verification) = result, case .verified(let t) = verification {
purchasedIDs.insert(t.productID)
await t.finish()
}
}
}
SubscriptionStoreView and customize its layout/appearance【587056330330254†screenshot】.SubscriptionStoreButton and SubscriptionStorePicker with picker styles (tabs, vertical stacks) and choose placement via subscriptionStoreControlStyle(_:placement:)【587056330330254†screenshot】.NSUserActivity with a well-defined activityType and userInfo.scene(_:continue:) to resume on target devices.SceneDelegate.scene(_:continue:) or SwiftUI .onOpenURL to route.NSExtensionItem and item providers.UIHostingController for SwiftUI inside the extension.reloadTimelines; check provider errors.content-available: 1, background mode, and App ID env.verification.Additional issues in iOS 17–18:
WidgetPushHandler in your widget extension and request a widget push token; ensure your server sends the push to the token and that your entitlements include the widget push capability.SnippetIntent and that any AppEntity used is marked as IndexedEntity with proper indexing keys. Spotlight must index entities before snippets appear.start parameter passed to Activity.request is in the future and within system limits (usually within 8 hours). Scheduled activities won’t start if push tokens or authorization fail.SubscriptionStoreView inside a view hierarchy on the main thread. Customizing control styles incorrectly can result in an empty list.BGContinuedProcessingTask only for critical long‑running work and implement regular checkpoints to call task.update(); the system may still terminate tasks for resource pressure.Design with Safety/Performance/Business/Design/Legal in mind. Be explicit about pricing, privacy, and data usage. Avoid private APIs and misleading permission prompts. Keep feature access proportionate to declared capabilities (e.g., background modes, NFC).
The scripts/ folder contains generators you can run locally or ask Claude to run with the provided JSON configs in examples/.
widget_generator.py — generate WidgetKit scaffold (intent/non-intent, families, previews).app_intent_generator.py — generate App Intents + Shortcut collections.live_activity_generator.py — generate ActivityKit attributes, views, and Dynamic Island.notification_generator.py — generate notification center delegate, categories, and actions.background_task_generator.py — generate BG task registration + scheduling utilities.entitlements_generator.py — generate Entitlements.plist and Info.plist snippets.Usage
python scripts/widget_generator.py --config examples/widget_config.json
python scripts/app_intent_generator.py --config examples/app_intent_config.json
python scripts/live_activity_generator.py --config examples/live_activity_config.json
python scripts/notification_generator.py --config examples/notification_config.json
python scripts/background_task_generator.py --config examples/background_task_config.json
python scripts/entitlements_generator.py --config examples/entitlements_config.json
Where files go
swift/<feature>/... (paths configurable via each script).examples/.docs/ and include testing strategies per feature.Tip: After generation, add the files to the proper targets in Xcode (app, widget extension, content extension, App Clip, watch app) and enable the matching capabilities.