App Intents 2.0 in iOS 26: Visual Intelligence, interaktive Snippets und Deferred Properties
App Intents wurde mit iOS 16 als Apples strukturiertes Aktions-API für Shortcuts, Siri und Spotlight ausgeliefert; iOS 17 erweiterte das Framework für App-Intents-gesteuerte Widgets; iOS 18 machte es zum Vertrag für die Aktionsoberfläche von Apple Intelligence. iOS 26 erweitert App Intents auf Visual Intelligence (Bildsuchergebnisse aus Drittanbieter-Apps), interaktive Snippets (kleine Pop-up-UI-Fenster, die sich in Systemkontexte einfügen), Entity-View-Annotationen (wie eine Entität inline gerendert wird) und @DeferredProperty (asynchron berechnete Entity-Eigenschaften)1. Die Erweiterungen ändern das Kernmodell von App Intents nicht; sie fügen neue Beteiligungsoberflächen hinzu, die eine App übernehmen kann.
Der Beitrag durchläuft die iOS-26-Ergänzungen anhand der Apple-Dokumentation. Der Rahmen lautet: „Welche neuen Oberflächen gewinnt eine bestehende App-Intents-Adoption durch das Hinzufügen der iOS-26-Konformitäten?” Denn die meisten Apps mit App Intents haben die grundlegenden Typen bereits etabliert, und die Arbeit in iOS 26 dreht sich darum, diese Typen in neue Kontexte zu erweitern.
TL;DR
IntentValueQueryist das neue Protokoll für die Visual-Intelligence-Integration. Die Query akzeptiert einenSemanticContentDescriptor(den visuellen Kontext des Benutzers) und gibt ein Array vonAppEntity-Instanzen zurück, die die App als relevant einstuft2.@DeferredPropertydeklariert eine Entity-Eigenschaft, deren Wert asynchron berechnet wird. Die Eigenschaft wird geladen, wenn das System sie tatsächlich benötigt, und vermeidet so Vorabkosten für Entitäten mit vielen kostengünstig anzeigbaren und einigen teuer zu berechnenden Feldern.- Interaktive App-Intents-Snippets ermöglichen es einer App, ein kleines Pop-up-Fenster (mit Schaltflächen, Text, Steuerelementen) innerhalb von Systemkontexten wie Spotlight, Visual Intelligence oder der Siri-Antwortoberfläche darzustellen. Das Snippet ist eine SwiftUI-View, die an das Ergebnis des App Intents gebunden ist.
- Entity-View-Annotationen ermöglichen es einer App zu deklarieren, wie eine
AppEntityin verschiedenen Systemkontexten gerendert werden soll (eine kompakte Zeile in Spotlight, eine Hero-Karte in Visual Intelligence, ein Live-Activity-ähnliches Widget). - Der Cluster-Beitrag App Intents behandelte das grundlegende Modell; dieser Beitrag erweitert es auf die neuen Beteiligungsoberflächen von iOS 26. Der Cluster-Beitrag App Intents vs. MCP Tools behandelt die Routing-Frage zwischen der Intent-Oberfläche von Apple Intelligence und allgemeinen Agenten-MCP-Tools.
Visual Intelligence: IntentValueQuery und SemanticContentDescriptor
Die wichtigste Ergänzung von App Intents in iOS 26 ist die Visual-Intelligence-Integration2. Der Ablauf:
- Der Benutzer macht ein Foto, erstellt einen Screenshot oder hält die Kamera auf ein Objekt.
- Die Visual-Intelligence-Schicht des Systems extrahiert visuellen und semantischen Kontext (was im Bild zu sehen ist, was der Benutzer dazu wissen möchte).
- Das System fragt jede App ab, die eine
IntentValueQuerymit diesem semantischen Kontext registriert hat. - Jede App gibt relevante
AppEntity-Instanzen zurück; das System aggregiert sie und präsentiert sie in der Visual-Intelligence-UI. - Der Benutzer tippt auf eine Entität, um die ursprüngliche App im richtigen Kontext zu öffnen.
Die Entwickleroberfläche ist ein Struct, das IntentValueQuery mit einer values(for:)-Methode konformiert, die einen SemanticContentDescriptor entgegennimmt:
import AppIntents
struct ProductLookupQuery: IntentValueQuery {
func values(for descriptor: SemanticContentDescriptor) async throws -> [Product] {
// descriptor.labels: detected category and content labels
// descriptor.pixelBuffer: the visual content as a CVReadOnlyPixelBuffer
// (use VideoToolbox/CoreImage to convert if needed)
let candidates = try await catalog.search(labels: descriptor.labels)
return candidates.map(Product.init)
}
}
Der SemanticContentDescriptor trägt zwei Felder, die das System befüllt: labels (ein Array erkannter Kategorie- und Inhalts-Tags wie „wine bottle”, „pinot noir”, „label text” usw.) und pixelBuffer (die zugrunde liegenden Bilddaten als CVReadOnlyPixelBuffer für Apps, die ihre eigenen Vision-Modelle auf den Inhalt anwenden möchten). Die Aufgabe der App besteht darin, diese Signale auf ihre eigenen Daten abzubilden und die passenden Entitäten zurückzugeben.
Das richtige Adoptionsmuster: Eine Shopping-App implementiert die Query gegen ihren Produktkatalog (visueller Kontext → passende Produkte), eine Wein-App gegen ihre Flaschendatenbank (Etikettenbild → Weineintrag), eine Rezept-App gegen ihre Rezeptbibliothek (Zutatenfoto → passende Rezepte).
@DeferredProperty: Asynchrone Entity-Werte
Bestehende AppEntity-Typen deklarieren ihre Eigenschaften statisch. Jede Eigenschaft muss berechnet werden, bevor die Entität zurückgegeben wird. Bei Entitäten mit Eigenschaften unterschiedlicher Kosten (schnelle Title/Subtitle/Image, langsame detaillierte Beschreibung vom Server) ist die Alles-oder-nichts-Berechnung verschwenderisch.
@DeferredProperty (iOS 26+) deklariert eine Eigenschaft als asynchron berechnet3:
import AppIntents
struct Recipe: AppEntity {
static var typeDisplayRepresentation = TypeDisplayRepresentation(...)
static var defaultQuery = RecipeQuery()
@Property(title: "Title")
var title: String
@Property(title: "Cuisine")
var cuisine: String
@DeferredProperty(title: "Detailed Instructions")
var instructions: String {
get async throws {
try await loadInstructionsFromBackend(id: id)
}
}
}
Der Getter der deferred Property ist asynchron; er läuft erst, wenn das System den Wert tatsächlich benötigt (z. B. wenn die Entität zur Detailanzeige ausgewählt wird). Bei Entitäten, die aus einer Query zurückgegeben werden und nur für die Auswahl-UI verwendet werden, wird die deferred Property nie berechnet.
Das Muster passt für jede Entität mit schnell aufzubauenden Feldern (id, title, summary) plus teuer aufzubauenden Feldern (vollständiger Body, berechnete Metriken, vom Server geholte Daten). Ohne @DeferredProperty berechnet der Entwickler entweder alles (verschwenderisch) oder nur die günstigen Felder und fügt einen separaten „Detail laden”-Intent hinzu (komplexer).
Interaktive Snippets und SnippetIntent
iOS 26 führt das spezielle SnippetIntent-Protokoll für Snippet-förmige Interaktionen ein, neben dem bestehenden ShowsSnippetView-konformierenden AppIntent-Muster aus früheren Releases4. SnippetIntent fügt eine statische reload()-Methode hinzu, die das System aufrufen kann, um den Inhalt des Snippets ohne vollständige erneute Intent-Aufruf zu aktualisieren:
struct WeatherSnippet: SnippetIntent {
static var title: LocalizedStringResource = "Weather Snippet"
@Parameter(title: "City")
var city: City
func perform() async throws -> some IntentResult & ShowsSnippetView {
let forecast = try await weatherService.forecast(for: city)
return .result(view: ForecastSnippet(forecast: forecast))
}
static func reload() async throws {
// Triggered by the system when it wants fresh snippet data
// (e.g., after the data source signals an update)
}
}
Für nicht-snippet-spezifische Intents, die ihrer Antwort eine Snippet-View anhängen möchten, funktioniert das bestehende AppIntent- + ShowsSnippetView-Muster weiterhin:
struct WeatherForecastIntent: AppIntent {
static var title: LocalizedStringResource = "Weather Forecast"
@Parameter(title: "City")
var city: City
func perform() async throws -> some IntentResult & ProvidesDialog & ShowsSnippetView {
let forecast = try await weatherService.forecast(for: city)
return .result(
dialog: "Here's the forecast for \(city.name).",
view: ForecastSnippet(forecast: forecast)
)
}
}
struct ForecastSnippet: View {
let forecast: Forecast
var body: some View {
VStack(alignment: .leading) {
Text(forecast.headline).font(.headline)
HStack {
ForEach(forecast.days) { day in
DayCell(day: day)
}
}
Button("Open in App") {
// App-launching action wired via App Intents
}
}
.padding()
}
}
Die ShowsSnippetView-Konformität des Ergebnistyps weist das System an, die SwiftUI-View neben dem Dialog zu rendern. Das Snippet ist interaktiv: Schaltflächen darin können andere App Intents auslösen, der Benutzer kann scrollen, die View nimmt an der Interaktionsschicht des Systems teil.
Die Fälle, die ein interaktives Snippet rechtfertigen: Wettervorhersagen, Kalenderereignisse, Verkehrszeiten, Sportergebnisse, Paketverfolgung. Überall dort, wo der Benutzer mehr als eine einzeilige Dialogantwort von der Systemoberfläche erwartet.
Entity-View-Annotationen
Entity-View-Annotationen ermöglichen es einer App zu deklarieren, wie eine AppEntity in verschiedenen Systemkontexten gerendert werden soll5. Der Mechanismus erweitert DisplayRepresentation um mehrere Varianten:
struct Recipe: AppEntity {
var displayRepresentation: DisplayRepresentation {
DisplayRepresentation(
title: "\(title)",
subtitle: "\(cuisine) - \(time) min",
image: .init(named: imageName)
)
}
}
Das klassische Modell gibt eine einzige DisplayRepresentation zurück. iOS 26 lässt Entitäten kontextspezifische Varianten bereitstellen, aus denen das System je nach Renderort auswählt (kompakte Liste, Hero-Karte, Spotlight-Ergebnis, Visual-Intelligence-Panel). Das Framework wählt die richtige Variante pro Kontext; die App deklariert jede einzelne.
Das Muster unterstützt Apps, bei denen sich das Entity-Rendering etwa zwischen einer dicht gepackten Spotlight-Liste und einer Einzelkarten-Visual-Intelligence-Antwort unterscheiden muss. Die Varianten setzen sich zusammen, ohne dass die App den Kontext erkennen muss.
Komposition mit bestehenden App Intents
Die iOS-26-Ergänzungen lassen sich mit bestehenden App-Intents-Primitiven kombinieren:
- Der
AppShortcutsProvidereiner App (behandelt in Accessibility as platform) registriert Shortcuts für Sprache, Action Button und Spotlight. - Jeder
AppShortcutreferenziert einenAppIntent, der@Parameter-Eigenschaften besitzt, die aus der Anfrage des Benutzers aufgelöst werden. - Die
AppIntent.perform()-Methode gibt einen Ergebnistyp zurück, der eine Snippet-View (ShowsSnippetView) oder einen Dialog (ProvidesDialog) enthalten kann. - Die von den Parametern des Intents referenzierten
AppEntity-Typen unterstützen jetzt@DeferredPropertyund Entity-View-Annotationen. - Neue
IntentValueQuery-Typen lassen dieselben Entitäten in Visual Intelligence erscheinen.
Die Form: Das bestehende Modell bleibt erhalten; die iOS-26-Arbeit fügt neue Typen (Queries) und neue Annotationen (Deferred, View-Varianten) zur selben Entity-Oberfläche hinzu.
Häufige Fehler
Drei Muster aus gescheiterten Adoptionen von App Intents 2.0:
IntentValueQuery gibt unbeschränkte Ergebnisse zurück. Eine Query, die jedes Produkt zurückgibt, das den Suchbegriffen des Descriptors entspricht, unabhängig von der Relevanz, verwässert das Visual-Intelligence-Erlebnis. Korrektur: Beschränken Sie die Query (Top-N nach Relevanz, mit Aktualität gewichtet, benutzerpersonalisiert), damit jede zurückgegebene Entität ihren Platz in der UI des Systems verdient.
@DeferredProperty für schnelle Werte. Der Deferred-Mechanismus ist für wirklich teure Berechnungen gedacht. Eine schnelle In-Memory-Eigenschaft als deferred zu markieren, fügt asynchronen Overhead ohne Nutzen hinzu. Korrektur: Reservieren Sie @DeferredProperty für Eigenschaften, die sich tatsächlich auszahlen, wenn sie aufgeschoben werden (Server-Aufrufe, große Berechnungen, ML-Modell-Aufrufe).
Interaktive Snippets, die ganze Apps sind. Ein Snippet ist eine kompakte UI-Oberfläche; es als Mini-App zu behandeln, erzeugt Snippets, die beengt wirken oder langsam rendern. Korrektur: Konzentrieren Sie Snippets auf die unmittelbare Antwort und ein oder zwei verwandte Aktionen; verwenden Sie die „Open in App”-Schaltfläche, um komplexe Abläufe an die vollständige App zu übergeben.
Was dieses Muster für iOS-26+-Apps bedeutet
Drei Erkenntnisse.
-
Fügen Sie
IntentValueQueryfür jede App mit visuellen Inhalten hinzu. Shopping, Rezepte, Produkte, Orte, identifizierbare Objekte. Die Visual-Intelligence-Integration ist die neue Discovery-Oberfläche; Apps, die nicht teilnehmen, sind dort unsichtbar. -
Verwenden Sie
@DeferredPropertyfür teure Entity-Felder. Detaillierte Beschreibungen, berechnete Metriken, vom Server geholte Daten. Das Default-Async-Muster passt zu modernem Swift-Code und hält die Rückgabe günstig zu erstellender Entitäten schnell. -
Übernehmen Sie interaktive Snippets für hochwertige Query-Typen. Wetter, Kalender, Verkehr, Sport, Paketverfolgung. Die Snippet-UI hält Benutzer auf der Systemantwortoberfläche für Fälle, in denen ein einzeiliger Dialog nicht ausreicht, ein vollständiger App-Start aber übertrieben wäre.
Der vollständige Apple-Ecosystem-Cluster: typisierte App Intents; MCP-Server; die Routing-Frage; Foundation Models; die Unterscheidung zwischen Runtime und Tooling-LLM; drei Oberflächen; das Single-Source-of-Truth-Muster; Two MCP Servers; Hooks für Apple-Entwicklung; Live Activities; die watchOS-Runtime; SwiftUI-Internals; RealityKits räumliches mentales Modell; SwiftData-Schema-Disziplin; Liquid-Glass-Muster; Multi-Plattform-Auslieferung; die Plattformmatrix; Vision-Framework; Symbol Effects; Core-ML-Inferenz; Writing Tools API; Swift Testing; Privacy Manifest; Accessibility als Plattform; SF-Pro-Typografie; visionOS-Spatial-Muster; Speech-Framework; SwiftData-Migrationen; tvOS-Focus-Engine; @Observable-Internals; SwiftUI-Layout-Protokoll; benutzerdefinierte SF-Symbole; AVFoundation HDR; watchOS-Workout-Lebenszyklus; worüber ich nicht schreibe. Der Hub befindet sich unter Apple Ecosystem Series. Für den breiteren Kontext von iOS mit AI-Agenten siehe den iOS Agent Development Guide.
FAQ
Muss Apple Intelligence aktiviert sein, um IntentValueQuery zu testen?
Für vollständige Visual-Intelligence-Tests ja. Visual Intelligence erfordert Apple-Intelligence-fähige Hardware (iPhone 15 Pro oder neuer, M1 Mac oder neuer) mit iOS 26+ und aktiviertem Apple Intelligence. Für die Entwicklung können Sie die Query in Unit-Tests testen, indem Sie einen SemanticContentDescriptor direkt konstruieren und die values(for:)-Methode der Query ohne den vollen System-Stack aufrufen.
Kann @DeferredProperty einen Fehler werfen?
Ja. Die Signatur des asynchronen Getters lautet get async throws, und Ausnahmen werden an das System weitergeleitet. Das System behandelt den Fehler, indem es die Entität ohne den Wert der deferred Property anzeigt (oder in einigen Kontexten einen Fehlerzustand zeigt). Apps sollten elegant scheitern und aussagekräftige Fehlerzustände zurückgeben, anstatt abzustürzen.
Unterstützen interaktive Snippet-Inhalte Animationen?
Ja, mit den standardmäßigen SwiftUI-Animations-Primitiven. Die View des Snippets läuft in der Antwortoberfläche des Systems, die dieselbe Animationsinfrastruktur wie In-App-SwiftUI unterstützt. Greifen Sie zum Cluster-Beitrag Symbol Effects für das Animationsvokabular, das den Plattformkonventionen entspricht.
Wie interagieren Entity-View-Annotationen mit Widgets?
Widgets sind eine separate WidgetKit-Oberfläche; Entity-View-Annotationen gelten innerhalb von App-Intents-Kontexten (Spotlight, Visual Intelligence, Siri-Antworten). Für eine App, die dieselben Daten sowohl als AppEntity als auch als Widget bereitstellt, erfordern die beiden Oberflächen separate UI-Deklarationen. Apps teilen üblicherweise das zugrunde liegende Datenmodell und schreiben dünne Präsentations-Views pro Oberfläche.
Wie ist das Verhältnis zu MCP-Tools?
App Intents sind die Intent-Oberfläche von Apple Intelligence; MCP-Tools sind das Agent-Server-Protokoll für allgemeine LLMs. iOS 26 fügt Visual Intelligence zu App Intents hinzu (Apples Oberfläche). Für Nicht-Apple-Agenten (Claude, GPT-Klasse) decken MCP-Tools, die lokal oder remote laufen, dasselbe konzeptionelle Terrain ab. Der Cluster-Beitrag App Intents vs. MCP Tools behandelt die Routing-Frage.
Kann IntentValueQuery mit EntityQuery kombiniert werden?
Ja. Sie bedienen unterschiedliche Oberflächen: EntityQuery ist für den Fall, dass der Benutzer einen Entity-Namen tippt oder spricht (Spotlight, Siri); IntentValueQuery ist für den Fall, dass der Benutzer in Visual Intelligence mit Bildkontext arbeitet. Die AppEntity einer App kann beide Queries registriert haben; das System wählt die richtige für den Kontext aus.
Referenzen
-
Apple Developer Documentation: App Intents. Die Framework-Referenz, die
AppIntent,AppEntity, Queries, Parameter und die iOS-26-Ergänzungen abdeckt. ↩ -
Apple Developer: Explore new advances in App Intents (WWDC 2025 Session 275). Die Einführung von
IntentValueQuery,SemanticContentDescriptorund der Visual-Intelligence-Integration. ↩↩ -
Apple Developer Documentation:
@DeferredProperty(). Das Macro für asynchron berechnete Entity-Eigenschaften, eingeführt für App Entities in iOS 26. Behandelt in WWDC 2025 Session 275 (Explore new advances in App Intents). ↩ -
Apple Developer Documentation: Interaktive App-Intents-Snippets über den
ShowsSnippetView-Ergebnistyp in Kombination mit SwiftUI-Views, die in Systemkontexten (Spotlight, Visual Intelligence, Siri-Antwortbereich) gerendert werden. ↩ -
Apple Developer Documentation:
DisplayRepresentationund Entity-View-Annotationen. Der Mechanismus zur Deklaration, wie eineAppEntityin verschiedenen Systemkontexten gerendert wird. ↩