iOS 27 brings significant updates to Live Activities and the Dynamic Island, including new expanded presentations, richer interactivity via App Intents directly from the island, and updated layout APIs for more expressive minimal and compact views.
⢠Compact and minimal Dynamic Island views now accept SwiftUI interactive controls (Button, Toggle) backed by App Intents ā previously these views were display-only
⢠New `DynamicIslandExpandedRegion(.bottom)` zone added alongside the existing leading/trailing/center regions
⢠`ActivityConfiguration` gains a `pushToStartToken` callback enabling Live Activities to be initiated remotely via APNs without prior app launch
⢠`ContentState` updates now support animated transitions using the new `.activityTransition` modifier for smoother data changes
⢠Compact and minimal Dynamic Island views now support interactive controls (buttons, toggles) powered by App Intents, letting users take action without opening the app
⢠New expanded presentation regions give developers more layout flexibility with dedicated leading, trailing, center, and bottom zones that adapt across device sizes
⢠Live Activities can now be started remotely via push notification updates even when the app has never been launched, broadening real-time use cases like delivery tracking and sports scores
Demonstrates a Live Activity with an interactive 'Mark as Received' button in the compact Dynamic Island view, plus the new bottom region in the expanded presentation.
import ActivityKitimport SwiftUIimport WidgetKit+import AppIntentsā// Pre-iOS 27: No App Intent interactivity in Dynamic Island views;ā// compact/minimal views were purely display-only.ā+// MARK: - Activity Attributesstruct DeliveryAttributes: ActivityAttributes {public struct ContentState: Codable, Hashable {var statusMessage: Stringvar estimatedMinutes: Intvar isDelivered: Bool}var trackingNumber: String}+// MARK: - App Intent for inline interaction+struct MarkDeliveredIntent: AppIntent {+ static var title: LocalizedStringResource = "Mark as Received"+ static var description = IntentDescription("Marks your package as received.")++ func perform() async throws -> some IntentResult {+ // Update the Live Activity state+ let activities = Activity<DeliveryAttributes>.activities+ for activity in activities {+ let newState = DeliveryAttributes.ContentState(+ statusMessage: "Delivered!",+ estimatedMinutes: 0,+ isDelivered: true+ )+ await activity.update(+ ActivityContent(state: newState, staleDate: nil),+ alertConfiguration: nil+ )+ }+ return .result()+ }+}++// MARK: - Widget / Live Activity UIstruct DeliveryLiveActivityView: Widget {var body: some WidgetConfiguration {ActivityConfiguration(for: DeliveryAttributes.self) { context inā // Lock Screen banner ā buttons here used Link/URL schemes, not App Intents+ // Lock Screen / StandBy bannerHStack {Image(systemName: "shippingbox.fill").foregroundStyle(.orange)VStack(alignment: .leading) {Text(context.state.statusMessage).font(.headline)Text("ETA: \(context.state.estimatedMinutes) min").font(.caption)}Spacer()ā // No interactive button available in Dynamic Island compact/minimal+ if !context.state.isDelivered {+ Button(intent: MarkDeliveredIntent()) {+ Label("Received", systemImage: "checkmark.circle.fill")+ }+ .tint(.green)+ }}.padding()} dynamicIsland: { context inDynamicIsland {ā // Expanded layout ā no bottom region existed pre-iOS 27+ // Expanded layout with new bottom regionDynamicIslandExpandedRegion(.leading) {Image(systemName: "shippingbox.fill").font(.title2).foregroundStyle(.orange)}DynamicIslandExpandedRegion(.trailing) {Text("\(context.state.estimatedMinutes)m").font(.title2.bold())}DynamicIslandExpandedRegion(.center) {Text(context.state.statusMessage).font(.headline).lineLimit(1)}ā // No .bottom region ā developers had to cram content into center/leading/trailing+ // iOS 27: new bottom region+ DynamicIslandExpandedRegion(.bottom) {+ if !context.state.isDelivered {+ Button(intent: MarkDeliveredIntent()) {+ Label("Mark as Received", systemImage: "checkmark.circle.fill")+ .frame(maxWidth: .infinity)+ }+ .buttonStyle(.borderedProminent)+ .tint(.green)+ } else {+ Label("Package Received!", systemImage: "checkmark.seal.fill")+ .foregroundStyle(.green)+ .activityTransition(.opacity.animation(.easeIn))+ }+ }} compactLeading: {Image(systemName: "shippingbox.fill").foregroundStyle(.orange)} compactTrailing: {ā // Display only ā no interactivityā Text("\(context.state.estimatedMinutes)m")ā .font(.caption.bold())+ // iOS 27: interactive control in compact view+ if !context.state.isDelivered {+ Button(intent: MarkDeliveredIntent()) {+ Image(systemName: "checkmark.circle")+ }+ .tint(.green)+ } else {+ Image(systemName: "checkmark.circle.fill")+ .foregroundStyle(.green)+ }} minimal: {ā Image(systemName: "shippingbox.fill")ā .foregroundStyle(.orange)+ Image(systemName: context.state.isDelivered ? "checkmark.circle.fill" : "shippingbox.fill")+ .foregroundStyle(context.state.isDelivered ? .green : .orange)}}}}
Liquid Glass is Apple's new material and visual design language introduced in iOS 27, bringing translucent, refractive glass-like surfaces to system and custom UI elements. It replaces the frosted vibrancy aesthetic with a more dynamic, depth-aware material that responds to content beneath it.
PaperKit is Apple's full-featured canvas framework ā previously internal-only ā now publicly available in iOS/macOS/visionOS 27. It powers the drawing and markup experience in Notes, Preview, and Freeform, giving developers access to a complete pencil, shapes, images, and text canvas with a rich data model.
Xcode 27 introduces a fully customizable toolbar and theme system, untitled scratch projects, coding agent integration directly in the editor, and the new Device Hub for evaluating apps across simulators and physical devices side-by-side.
In-depth guide
SwiftUI & Liquid Glass in iOS 27 āInteractive controls in compact/minimal views require App Intents with explicit user-facing descriptions; missing entitlements will silently prevent Live Activities from starting. The new bottom zone in expanded layout clips on smaller Dynamic Island variants ā always test on multiple device sizes. Push-to-start requires a new ActivityKit push payload key and a separate APNs topic suffix.
Dynamic Island UI requires iPhone 14 Pro or later; non-Dynamic Island devices fall back to the Lock Screen banner presentation
iOS 27 introduces new SwiftUI drag and drop APIs including reorderable, reorderContainer, dragContainer, and configuration modifiers that enable reordering within and across collections, multi-item drag, and fine-grained control over how data is transferred during drag and drop operations.