You've built a mobile app, and your users want to automate scenarios via Shortcuts. Without App Intents integration, they're forced to open the app manually for every action. App Intents became the standard for iOS automation, allowing tasks to run without launching the app.
We deliver deep integration: from basic commands to passing complex data between actions. With over 20 successful iOS projects, we ensure compatibility with the latest iOS versions and bug-free automation. The typical support cost savings after App Intents adoption fully offset the development investment within months. Moreover, automating routine data entry reduces manual QA costs by a similar margin.
Why Choose App Intents Over SiriKit?
Before App Intents, integration relied on SiriKit with .intentdefinition files and an INExtension in a separate target. That required lots of boilerplate code and code generation. Starting with iOS 16, the AppIntents framework is simpler: less code, intents visible in Shortcuts without extra setup. Here's a comparison:
| Feature | SiriKit | App Intents |
|---|---|---|
| Complexity | High (separate target, code generation) | Low (single file) |
| Performance | Medium | High (runs without opening app) |
| iOS Support | iOS 10+ | iOS 16+ |
| Dynamic Parameters | Via INObject | Via AppEntity (simpler) |
| App Shortcuts | No | Built-in |
App Intents wins on every metric for new projects. Development is 3x faster than SiriKit—less code, fewer templates. We recommend migrating from SiriKit if your app still uses the old approach. Migration cuts development time for new automations by 40%.
How App Intents Streamline Development
Minimal intent for Shortcuts:
struct StartWorkoutIntent: AppIntent {
static var title: LocalizedStringResource = "Start Workout"
static var description = IntentDescription(
"Starts a workout in the app",
categoryName: "Workouts"
)
static var openAppWhenRun: Bool = false // don't open app
@Parameter(title: "Workout Type")
var workoutType: WorkoutType
func perform() async throws -> some IntentResult & ProvidesDialog {
try await WorkoutService.shared.start(type: workoutType)
return .result(dialog: "Workout \(workoutType.name) started")
}
}
openAppWhenRun: Bool = false is key for automations. The intent runs in the background without opening the app. For Shortcuts this is critical—otherwise the screen flashes and opens your UI.
What Are AppEntity and Why Do You Need Them?
Static parameters (String, Int, Bool, Date) are simple properties with @Parameter. Dynamic ones use AppEntity with AppEntityQuery.
enum WorkoutType: String, AppEnum {
case running, cycling, swimming
static var typeDisplayRepresentation = TypeDisplayRepresentation(name: "Workout Type")
static var caseDisplayRepresentations: [WorkoutType: DisplayRepresentation] = [
.running: "Running",
.cycling: "Cycling",
.swimming: "Swimming"
]
}
AppEnum is a closed list. AppEntity + AppEntityQuery is a dynamic list from your app's database. If a user adds a custom workout type, it must appear in Shortcuts as an option—only possible via AppEntityQuery.entities(matching:).
| Parameter Type | Usage | Example |
|---|---|---|
| @Parameter | Basic types | String, Int, Bool, Date |
| AppEnum | Closed list | WorkoutType.running |
| AppEntity + Query | Dynamic list | Workout from CoreData |
How to Pass Data Between Shortcuts Actions?
Shortcuts allows passing one action's result to another. The intent must return a concrete type, not just a dialog.
func perform() async throws -> some IntentResult & ReturnsValue<WorkoutSummary> {
let summary = try await WorkoutService.shared.getLastSummary()
return .result(value: summary)
}
WorkoutSummary is a struct conforming to AppEntity or a basic type. Now the next Shortcuts block can receive this data as a parameter.
App Shortcuts: Phrases Without Setup
AppShortcutsProvider provides phrases that work without manual user setup:
struct FitnessAppShortcuts: AppShortcutsProvider {
static var appShortcuts: [AppShortcut] {
AppShortcut(
intent: StartWorkoutIntent(),
phrases: [
"Start workout in \(.applicationName)",
"Launch \(.applicationName)"
],
shortTitle: "Start Workout",
systemImageName: "figure.run"
)
}
static var shortcutTileColor: ShortcutTileColor = .teal
}
The phrase with \(.applicationName) is mandatory. Apple checks for the app name in phrases during review (App Store Review Guidelines Section 4.2). Without it, rejection.
You can now use parameters directly in phrases: "Start running in \(.applicationName)"—Siri recognizes "running" as the workoutType parameter value.
Widgets and Shortcuts Together
Buttons in widgets use the same AppIntent. One intent works as a Shortcuts action, a widget button, and a voice command. This greatly simplifies development: logic is written once.
Integration Stages
- Scenario Analysis: Identify which actions users want to automate.
- Struct Model Design: Create AppIntent, AppEntity, AppEnum for each action.
- Implement perform(): Write execution logic with background support.
- Configure AppShortcutsProvider: Localize phrases for Siri and Shortcuts.
- Testing: Verify on simulators and real devices, including automations.
- Deployment: Submit build to App Store Connect and review.
Testing
In simulator: Settings → Siri & Search → [app] shows registered intents. The Shortcuts app on the simulator allows adding an intent to an automation manually and executing it.
For App Shortcuts: use XCTest with XCTOSSignpostExpectation or simply run via Shortcuts.app and check the result.
What's Included
- Intent development tailored to your business scenarios.
-
AppEntityandAppEntityQueryfor dynamic data. -
AppShortcutsProviderintegration with localized phrases. - Testing on real devices and simulators.
- Documentation for usage and maintenance.
Timelines and Pricing
Base integration (3–5 intents, no AppEntity): 2–4 weeks. Full integration with AppEntity, App Shortcuts, and value passing: 5–9 weeks. Migration from SiriKit intents to App Intents: 3–6 weeks. Pricing is determined individually based on the number and complexity of actions. Contact us for a project estimate—we'll provide a quote and timeline. Get a consultation to learn how App Intents can reduce your automation development costs.
Additional information can be found in Apple's official documentation.
Important: App Intents do not require additional permissions unless using private data—in that case, configure App Tracking Transparency.







