/live-activity-generator
Generate ActivityKit Live Activity infrastructure with Dynamic Island layouts, Lock Screen presentation, and push-to-update support. Use when adding Live Activities to an iOS app.
$ npx -y skills add rshankras/claude-code-apple-skills --skill live-activity-generator --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/live-activity-generator
Context preview
The summary Claude sees to decide when to auto-load this skill.
Generate ActivityKit Live Activity infrastructure with Dynamic Island layouts, Lock Screen presentation, and push-to-update support. Use when adding Live Activities to an iOS app.
SKILL.md
live-activity-generator.SKILL.mdname: live-activity-generator
description: Generate ActivityKit Live Activity infrastructure with Dynamic Island layouts, Lock Screen presentation, and push-to-update support. Use when adding Live Activities to an iOS app.
allowed-tools: [Read, Write, Edit, Glob, Grep, Bash, AskUserQuestion]
last_verified: 2026-07-16
review_by: 2027-06-22
os_version: iOS 27 / macOS 27
Live Activity Generator
Generate a complete ActivityKit Live Activity implementation with Dynamic Island layouts, Lock Screen presentation, activity lifecycle management, and push-to-update support.
When This Skill Activates
Use this skill when the user:
- Asks to "add Live Activities" or "add a Live Activity"
- Mentions "Dynamic Island" layouts
- Wants real-time status updates on the Lock Screen
- Asks about "ActivityKit" or "ActivityAttributes"
- Mentions "push-to-update" for live activities
- Wants to show ongoing progress (delivery tracking, sports scores, timers, workouts)
Pre-Generation Checks
1. Project Context Detection
- [ ] Check for existing ActivityKit implementations
- [ ] Check for an existing widget extension target
- [ ] Verify deployment target is iOS 16.1+
- [ ] Identify source file locations
2. Conflict Detection
Search for existing Live Activity code:
Glob: **/*Activity*.swift, **/*LiveActivity*.swift
Grep: "ActivityKit" or "ActivityAttributes" or "ActivityConfiguration"
If an existing widget extension is found:
- Ask if the Live Activity should be added to the existing widget bundle
- Check for existing `WidgetBundle` to extend
If Live Activity code already exists:
- Ask user whether to replace or extend
3. Required Capabilities
**Live Activities require:**
- iOS 16.1+ deployment target
- `NSSupportsLiveActivities` set to `YES` in Info.plist
- A widget extension target (can share with existing WidgetKit widgets)
- For push updates: `NSSupportsLiveActivitiesFrequentUpdates` (optional, iOS 16.2+)
Configuration Questions
Ask user via AskUserQuestion:
1. **What is the Live Activity for?** (freeform)
- Examples: delivery tracking, sports score, workout timer, ride-sharing, food order
- This determines the attribute fields and content state
2. **What data should appear on the Lock Screen?** (freeform)
- Static data (set at start, does not change): e.g., restaurant name, order number
- Dynamic data (updated over time): e.g., ETA, driver location, score
3. **Dynamic Island layout needs?**
- Compact (leading + trailing) only
- Expanded (leading, trailing, center, bottom) only
- Both compact and expanded (recommended)
4. **Push-to-update support?**
- Yes -- server can update the activity remotely via APNs
- No -- updates only from the app process
5. **Alert configuration when ending?**
- Yes -- show a final alert on the Lock Screen when the activity ends
- No -- dismiss silently
Generation Process
Step 1: Determine File Locations
Check project structure:
- If a widget extension target exists, add files there
- Otherwise, instruct user to create a Widget Extension target first
For the activity manager (lives in the main app target):
- If `Sources/` exists --> `Sources/LiveActivity/`
- If `App/` exists --> `App/LiveActivity/`
- Otherwise --> `LiveActivity/`
For the widget extension views:
- Place inside the existing widget extension directory (e.g., `MyAppWidgets/`)
Step 2: Create Core Files
Generate these files based on configuration answers:
1. **`{Name}ActivityAttributes.swift`** -- Shared between app and widget extension
- `ActivityAttributes` struct with static properties
- Nested `ContentState` with dynamic properties
2. **`{Name}LiveActivityView.swift`** -- Widget extension file
- `ActivityConfiguration` with Lock Screen, Dynamic Island layouts
3. **`{Name}ActivityManager.swift`** -- Main app target file
- Protocol-based manager for start, update, end, and push token handling
Step 3: Generate Code from Templates
Use the templates in **templates.md** and customize based on user answers:
- Replace placeholder attribute names with real fields
- Configure Dynamic Island regions based on layout choice
- Include or exclude push-to-update code
- Include or exclude alert configuration
Info.plist Required
Main App Target
<key>NSSupportsLiveActivities</key>
<true/>
<!-- Optional: for frequent push updates (iOS 16.2+) -->
<key>NSSupportsLiveActivitiesFrequentUpdates</key>
<true/>
Output Format
After generation, provide:
Files Created
Sources/LiveActivity/
├── {Name}ActivityAttributes.swift # Shared: attributes + content state
└── {Name}ActivityManager.swift # Main app: lifecycle management
MyAppWidgets/
├── {Name}LiveActivityView.swift # Widget ext: all Live Activity UI
└── (update WidgetBundle if needed)Integration Steps
**1. Add the widget extension target (if not present):**
- File > New > Target > Widget Extension
- Ensure "Include Live Activity" is checked
**2. Share the attributes file between targets:** The `{Name}ActivityAttributes.swift` file must be included in both the main app target and the widget extension target. Select the file in Xcode, open the File Inspector, and check both targets under "Target Membership".
**3. Add Info.plist entries in the main app target:**
<key>NSSupportsLiveActivities</key>
<true/>
**4. Register the Live Activity configuration in the widget bundle:**
@main
struct MyAppWidgets: WidgetBundle {
var body: some Widget {
// Existing widgets...
MyAppLiveActivity()
}
}**5. Start a Live Activity from your app:**
let attributes = DeliveryActivityAttributes(
orderNumber: "1234",
restaurantName: "Pizza Place"
)
let initialState = DeliveryActivityAttributes.ContentState(
status: .preparing,
estimatedDelivery: Date().addingTimeInterval(30 * 60),
driverName: nil
)
let manager = LiveActivityManager()
try await manager.starRead more
name: live-activity-generator description: Generate ActivityKit Live Activity infrastructure with Dynamic Island layouts, Lock Screen presentation, and push-to-update support. Use when adding Live Activities to an iOS app. allowed-tools: [Read, Write, Edit, Glob, Grep, Bash, AskUserQuestion] last_verified: 2026-07-16 review_by: 2027-06-22 os_version: iOS 27 / macOS 27
Live Activity Generator
Generate a complete ActivityKit Live Activity implementation with Dynamic Island layouts, Lock Screen presentation, activity lifecycle management, and push-to-update support.
When This Skill Activates
Use this skill when the user:
- Asks to "add Live Activities" or "add a Live Activity"
- Mentions "Dynamic Island" layouts
- Wants real-time status updates on the Lock Screen
- Asks about "ActivityKit" or "ActivityAttributes"
- Mentions "push-to-update" for live activities
- Wants to show ongoing progress (delivery tracking, sports scores, timers, workouts)
Pre-Generation Checks
1. Project Context Detection
- [ ] Check for existing ActivityKit implementations
- [ ] Check for an existing widget extension target
- [ ] Verify deployment target is iOS 16.1+
- [ ] Identify source file locations
2. Conflict Detection
Search for existing Live Activity code:
Glob: **/*Activity*.swift, **/*LiveActivity*.swift Grep: "ActivityKit" or "ActivityAttributes" or "ActivityConfiguration"
If an existing widget extension is found:
- Ask if the Live Activity should be added to the existing widget bundle
- Check for existing `WidgetBundle` to extend
If Live Activity code already exists:
- Ask user whether to replace or extend
3. Required Capabilities
**Live Activities require:**
- iOS 16.1+ deployment target
- `NSSupportsLiveActivities` set to `YES` in Info.plist
- A widget extension target (can share with existing WidgetKit widgets)
- For push updates: `NSSupportsLiveActivitiesFrequentUpdates` (optional, iOS 16.2+)
Configuration Questions
Ask user via AskUserQuestion:
1. **What is the Live Activity for?** (freeform)
- Examples: delivery tracking, sports score, workout timer, ride-sharing, food order
- This determines the attribute fields and content state
2. **What data should appear on the Lock Screen?** (freeform)
- Static data (set at start, does not change): e.g., restaurant name, order number
- Dynamic data (updated over time): e.g., ETA, driver location, score
3. **Dynamic Island layout needs?**
- Compact (leading + trailing) only
- Expanded (leading, trailing, center, bottom) only
- Both compact and expanded (recommended)
4. **Push-to-update support?**
- Yes -- server can update the activity remotely via APNs
- No -- updates only from the app process
5. **Alert configuration when ending?**
- Yes -- show a final alert on the Lock Screen when the activity ends
- No -- dismiss silently
Generation Process
Step 1: Determine File Locations
Check project structure:
- If a widget extension target exists, add files there
- Otherwise, instruct user to create a Widget Extension target first
For the activity manager (lives in the main app target):
- If `Sources/` exists --> `Sources/LiveActivity/`
- If `App/` exists --> `App/LiveActivity/`
- Otherwise --> `LiveActivity/`
For the widget extension views:
- Place inside the existing widget extension directory (e.g., `MyAppWidgets/`)
Step 2: Create Core Files
Generate these files based on configuration answers:
1. **`{Name}ActivityAttributes.swift`** -- Shared between app and widget extension
- `ActivityAttributes` struct with static properties
- Nested `ContentState` with dynamic properties
2. **`{Name}LiveActivityView.swift`** -- Widget extension file
- `ActivityConfiguration` with Lock Screen, Dynamic Island layouts
3. **`{Name}ActivityManager.swift`** -- Main app target file
- Protocol-based manager for start, update, end, and push token handling
Step 3: Generate Code from Templates
Use the templates in **templates.md** and customize based on user answers:
- Replace placeholder attribute names with real fields
- Configure Dynamic Island regions based on layout choice
- Include or exclude push-to-update code
- Include or exclude alert configuration
Info.plist Required
Main App Target
<key>NSSupportsLiveActivities</key> <true/> <!-- Optional: for frequent push updates (iOS 16.2+) --> <key>NSSupportsLiveActivitiesFrequentUpdates</key> <true/>
Output Format
After generation, provide:
Files Created
Sources/LiveActivity/
├── {Name}ActivityAttributes.swift # Shared: attributes + content state
└── {Name}ActivityManager.swift # Main app: lifecycle management
MyAppWidgets/
├── {Name}LiveActivityView.swift # Widget ext: all Live Activity UI
└── (update WidgetBundle if needed)Integration Steps
**1. Add the widget extension target (if not present):**
- File > New > Target > Widget Extension
- Ensure "Include Live Activity" is checked
**2. Share the attributes file between targets:** The `{Name}ActivityAttributes.swift` file must be included in both the main app target and the widget extension target. Select the file in Xcode, open the File Inspector, and check both targets under "Target Membership".
**3. Add Info.plist entries in the main app target:**
<key>NSSupportsLiveActivities</key> <true/>
**4. Register the Live Activity configuration in the widget bundle:**
@main
struct MyAppWidgets: WidgetBundle {
var body: some Widget {
// Existing widgets...
MyAppLiveActivity()
}
}**5. Start a Live Activity from your app:**
let attributes = DeliveryActivityAttributes(
orderNumber: "1234",
restaurantName: "Pizza Place"
)
let initialState = DeliveryActivityAttributes.ContentState(
status: .preparing,
estimatedDelivery: Date().addingTimeInterval(30 * 60),
driverName: nil
)
let manager = LiveActivityManager()
try await manager.starA collection of Claude Code skills for iOS, macOS, watchOS, visionOS, and Apple platform development. These skills help you plan and build apps, maintain code quality, ensure HIG compliance, and guide you from idea to App Store.
Repo: rshankras/claude-code-apple-skills
Other skills on rshankras-apple-skills.
- /app-store
App Store optimization and marketing skills for descriptions, screenshots, keywords, review responses, and comprehensive promotional strategy. Use when user needs help with App Store presence, ASO, marketing, or customer communication.
Open skill - /ad-attribution
Privacy-preserving ad measurement with AdAttributionKit (SKAdNetwork's successor) — install and re-engagement attribution, conversion-value strategy under crowd anonymity, and end-to-end postback testing. Use when running paid acquisition beyond Apple Ads, measuring
Open skill - /app-description-writer
Generate compelling App Store descriptions that convert browsers into users. Use when writing initial descriptions, improving existing copy, or drafting promotional text and What's New for a major update.
Open skill - /apple-search-ads
Apple Search Ads campaign strategy for indie developers — paid acquisition, keyword bidding, budget planning, and ROAS optimization. Use when user asks about running ads, paid user acquisition, or Apple Search Ads campaigns.
Open skill - /iap-finalizer
Take a one-time in-app purchase from MISSING_METADATA to READY_TO_SUBMIT in App Store Connect — set its price schedule and localized display name/description (and optional review screenshot) via the ASC REST API. Use at Phase 6 (Pre-Release), after the IAP is built in-app (Phase
Open skill - /keyword-optimizer
Optimize app title, subtitle, and keywords for maximum App Store discoverability. Use when launching a new app, improving search rankings, entering new markets/languages, or safely optimizing ASO for an app with existing traffic.
Open skill

