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.
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.
iOS 27 opens the Foundation Models framework to third-party LLM providers via a new public LanguageModel protocol, allowing anyone to integrate server-based or local models (e.g. Claude, Gemini, CoreAI, MLX) using the same API as Apple's on-device system model.
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.
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.