iOS 27 brings persistent Storage to Shortcuts (letting values sync across devices between runs), three new automation triggers (screenshot, keyboard, notification), and an improved Use Model action with transcript inspection for debugging LLM-driven shortcut steps.
• New Storage feature lets shortcuts persist and sync typed values (including App Entities) between runs across all devices.
• Three new automation triggers added: screenshot saved, external keyboard connected/disconnected, and notification received from a specific app.
• Use Model action gains access to newer, more capable Apple Intelligence models with optional web search.
• Use Model output now exposes a Transcript property for inspecting the raw payload sent to the model, enabling systematic debugging of App Entity exposure.
• Storage lets shortcuts accumulate state across runs and devices — enabling everything from simple counters to rich entity histories without external servers.
• The notification automation trigger lets users build powerful automations off your app's notifications, making well-crafted notification content a first-class developer concern.
• Use Model transcript inspection gives developers a direct window into what an LLM actually received, making debugging App Entity exposure fast and precise.
Demonstrates how to expose an App Entity with rich properties so the Use Model action can reason about it, and how to implement a stable cross-device entity identifier required for Shortcuts Storage.
import AppIntents
// MARK: - Stable, cross-device entity identifier backed by a server DB row ID
struct SoupEntity: AppEntity {
static var typeDisplayRepresentation: TypeDisplayRepresentation = "Soup"
static var defaultQuery = SoupQuery()
/// Use the server-side database row ID so the same soup is recognised
/// on every device — never use a locally-generated UUID here.
var id: Int // e.g. 42
@Property(title: "Name")
var name: String
@Property(title: "Available Today")
var availableToday: Bool
/// Added so Use Model can reason about spice level.
/// Format: "jalapeño – 15 g per serving"
@Property(title: "Ingredients")
var ingredients: [String]
var displayRepresentation: DisplayRepresentation {
DisplayRepresentation(title: "\(name)",
subtitle: availableToday ? "Available" : "Unavailable")
}
}
// MARK: - Query used by Find Soups action and Shortcuts Storage resolution
struct SoupQuery: EntityQuery {
func entities(for identifiers: [Int]) async throws -> [SoupEntity] {
// Fetch soups from the shared online database by stable row ID
return try await SoupDatabase.shared.fetchSoups(ids: identifiers)
}
func suggestedEntities() async throws -> [SoupEntity] {
return try await SoupDatabase.shared.fetchAllSoups()
}
}
// MARK: - Find Soups action exposed to Shortcuts
struct FindSoupsIntent: AppIntent {
static var title: LocalizedStringResource = "Find Soups"
static var description = IntentDescription("Returns soups available from Soup Chef.")
@Parameter(title: "Only Today's Soups", default: true)
var onlyToday: Bool
func perform() async throws -> some ReturnsValue<[SoupEntity]> {
let soups = try await SoupDatabase.shared.fetchAllSoups()
let filtered = onlyToday ? soups.filter(\.availableToday) : soups
return .result(value: filtered)
}
}
// MARK: - Order Soup action
struct OrderSoupIntent: AppIntent {
static var title: LocalizedStringResource = "Order Soup"
@Parameter(title: "Soup")
var soup: SoupEntity
func perform() async throws -> some ProvidesDialog {
try await SoupDatabase.shared.placeOrder(soupId: soup.id)
return .result(dialog: "Order placed for \(soup.name)!")
}
}
// MARK: - Minimal stand-in for the database layer
final class SoupDatabase {
static let shared = SoupDatabase()
func fetchAllSoups() async throws -> [SoupEntity] { [] }
func fetchSoups(ids: [Int]) async throws -> [SoupEntity] { [] }
func placeOrder(soupId: Int) async throws {}
}iOS 27 adds sectioned queries, codable model attributes, ResultsObserver for non-SwiftUI change observation, and HistoryObserver for reacting to persistent history changes in SwiftData.
USDKit is a new first-party Swift framework introduced in iOS/macOS 27 that brings native USD scene creation, composition, modification, and export capabilities to Apple platform apps, with deep RealityKit and Spatial Preview integration.
LiveCommunicationKit is the modern replacement for CXProvider that delivers rich, native conversation UIs integrated with the Lock Screen, Dynamic Island, Phone app Recents, and Siri. It provides a unified lifecycle model for audio and video conversations with a single delegate-driven action pipeline.
In-depth guide
iOS 26 → iOS 27 Migration Guide →Stored App Entities must use stable, cross-device identifiers (e.g. a server database row ID) — device-local identifiers will break entity resolution when a value stored on iPhone is read on iPad or Mac. The Use Model action remains deterministic by design; use Storage to inject variation when needed.
Use Model action with web access and new Apple Intelligence models requires an Apple Intelligence-capable device
The NowPlaying framework introduces a first-class Swift API for surfacing app media in system-wide now-playing surfaces — Lock Screen, Control Center, Dynamic Island, StandBy, CarPlay, Apple Watch, and Apple TV — via a declarative MediaSessionRepresentable protocol. It also supports remote media sessions (for controlling external speakers/TVs) and Media Sharing Extensions for routing media to third-party devices.