iOS 27 extends App Intents with new APIs for custom Siri dialog responses, interaction donations, OwnershipProvidingEntity for smart confirmations, and IndexedEntityQuery for semantic Spotlight indexing ā enabling richer, more personal Siri and Apple Intelligence experiences.
⢠New OwnershipProvidingEntity protocol lets entities declare public/shared state so Siri auto-confirms before mutating shared data
⢠New IndexedEntityQuery protocol supports on-demand reindexing requests from Spotlight for App Entities
⢠IntentDonationManager API now supports donating schema-conforming intents from UI interactions for Apple Intelligence context
⢠ProvidesDialog and ShowsSnippetView return types on perform() allow fully custom Siri response text and SwiftUI snippet views
⢠Interaction Donations let Apple Intelligence learn from in-app UI actions (not just Siri calls), so it can infer the right app and contact for future requests
⢠OwnershipProvidingEntity tells Siri whether an entity is private or shared, triggering appropriate confirmation dialogs before side-effecting actions
⢠IndexedEntityQuery + indexAppEntities enables semantic (meaning-based) Spotlight search so Siri can find your content by intent, not just keyword
Demonstrates donating a SendMessageIntent from the app UI so Apple Intelligence learns user preferences, and marking a shared conversation entity with OwnershipProvidingEntity so Siri confirms before updating it.
import AppIntents+import CoreSpotlightā// Pre-iOS 27: Basic entity with no ownership info, no custom snippet,ā// and no interaction donation from UI+// MARK: - Entity with ownership awarenessāstruct ConversationEntity: AppEntity {+struct ConversationEntity: AppEntity, OwnershipProvidingEntity {static let typeDisplayRepresentation = TypeDisplayRepresentation(name: "Conversation")static let defaultQuery = ConversationEntityQuery()let id: Stringlet title: Stringlet isGroupChat: Boolvar displayRepresentation: DisplayRepresentation {ā DisplayRepresentation(title: "\(title)")ā // No subtitle, no image, no ownership info+ DisplayRepresentation(+ title: "\(title)",+ subtitle: isGroupChat ? "Group" : "Direct",+ image: .init(systemName: isGroupChat ? "person.3" : "person")+ )}ā // No OwnershipProvidingEntity ā Siri assumes private, may skip confirmationā // even for shared/group conversations++ // OwnershipProvidingEntity: tell Siri if this entity is shared+ var ownership: EntityOwnership {+ isGroupChat ? .shared : .private+ }}struct ConversationEntityQuery: EntityQuery {func entities(for identifiers: [String]) async throws -> [ConversationEntity] {ā identifiers.map { ConversationEntity(id: $0, title: "Chat \($0)", isGroupChat: false) }+ identifiers.map { ConversationEntity(id: $0, title: "Chat \($0)", isGroupChat: $0.hasPrefix("group")) }}}+// MARK: - Intent with custom dialog + snippet view+struct SendMessageIntent: AppIntent {static let title: LocalizedStringResource = "Send Message"+ static let description = IntentDescription("Sends a message in UnicornChat")static let openAppWhenRun: Bool = false@Parameter(title: "Conversation") var conversation: ConversationEntity@Parameter(title: "Message") var messageText: Stringā func perform() async throws -> some IntentResult {ā // Send the message ā no custom dialog, no snippet view+ @MainActor+ func perform() async throws -> some ProvidesDialog & ShowsSnippetView {+ // Send the messagetry await MessageService.send(messageText, to: conversation.id)ā return .result()ā // Siri generates a generic response with no branding++ return .result(+ dialog: IntentDialog(+ full: "Sent \"\(messageText)\" to \(conversation.title).",+ supporting: "Message sent"+ )+ ) {+ MessageSentSnippetView(conversation: conversation, message: messageText)+ }}}+// MARK: - Donate from UI so Apple Intelligence learns preferences+final class MessageService {ā static func send(_ text: String, to conversationId: String) async throws {ā // ... send logic ...ā // No donation ā Apple Intelligence never learns from UI interactions+ static func send(_ text: String, to conversationId: String, donateIntent: Bool = true) async throws {+ // ... actual send logic ...++ guard donateIntent else { return }++ // Build and donate the intent so Apple Intelligence learns this preference+ var intent = SendMessageIntent()+ intent.conversation = ConversationEntity(id: conversationId, title: "Chat \(conversationId)", isGroupChat: false)+ intent.messageText = text++ let result = SendMessageIntentResult()+ await IntentDonationManager.shared.donate(intent: intent, result: result)}+}++struct SendMessageIntentResult: IntentResult {+ // Empty result ā donation only needs the intent populated+}++// MARK: - Snippet SwiftUI view++import SwiftUI++struct MessageSentSnippetView: View {+ let conversation: ConversationEntity+ let message: String++ var body: some View {+ HStack(spacing: 12) {+ Image(systemName: "checkmark.circle.fill")+ .foregroundStyle(.green)+ .font(.title2)+ VStack(alignment: .leading) {+ Text(conversation.title).font(.headline)+ Text(message).font(.subheadline).foregroundStyle(.secondary)+ }+ }+ .padding()+ .background(.regularMaterial, in: RoundedRectangle(cornerRadius: 12))+ }}
Foundation Models is a new Apple framework introduced in iOS 27 that gives developers on-device access to the same Apple Intelligence language model powering system features, enabling text generation, structured output, and tool-calling entirely on-device without a network connection.
iOS 27 opens the Foundation Models framework to third-party LLM providers via a new public LanguageModel protocol, enabling anyone to integrate custom, server-based, or open-source models using the same Swift API as Apple's on-device system model.
App Schemas let developers describe their app's content and actions using pre-defined domain schemas (like the Calendar domain) so Siri can understand, search, and act on app data without custom NLP. Entities conforming to IndexedEntity are donated to Spotlight's semantic index, enabling natural-language queries over app content.
In-depth guide
iOS 27 On-Device AI & Apple Intelligence ā⢠Donate interactions only for real user UI actions ā excessive donations may be ignored by the system ⢠OwnershipProvidingEntity must be kept up to date every time the system requests an entity; stale state can cause incorrect confirmation behavior ⢠ShowsSnippetView custom views must be lightweight SwiftUI ā avoid heavy animations or network-loaded images in snippet views ⢠IndexedEntityQuery is only needed if you don't already implement Core Spotlight reindexing APIs
Apple Intelligence features require Apple Intelligence-capable devices (iPhone 15 Pro / iPhone 16 and later, iPad with M1+). Interaction donations and semantic indexing work on all devices.
Visual Intelligence brings iOS 17's Visual Look Up capabilities to a new developer-facing API surface in iOS 27, letting apps pipe live camera frames or static images through on-device scene understanding to extract subjects, text, barcodes, and rich semantic labels without any cloud round-trip.