Dynamic Island — ett interaktivt område högst upp på iPhone 14 Pro och alla iPhone 15/16, som sammanför aviseringar, bakgrundsaktiviteter och systemindikatorer i en enda dynamisk zon. Till skillnad från den traditionella utskärningen (notch) ändrar Dynamic Island form och storlek beroende på aktuellt sammanhang. Enligt Apple (WWDC 2024) interagerar användare med Dynamic Island i genomsnitt 12 gånger per dag — genom tryckningar, långa tryck och Live Activities med ActivityKit. Läs mer om animationer i iOS i artikeln om Corner Radius.
Huvudpunkter
Dynamic Island — är ett interaktivt område baserat på Apples programvaru-hårdvarulösning, som introducerades i september 2022 tillsammans med iPhone 14 Pro. Fysiskt är det en utskärning i form av ett piller, omgiven av OLED-pixlar som dynamiskt ändrar färg och form. Apple använder en kombination av hårdvaruutrymmet för kameran och Face ID med programvarurendering av svarta områden runt det, vilket skapar illusionen av en «levande» ö.
Huvudmålet med Dynamic Island är att överbrygga klyftan mellan systemaviseringar och aktivt innehåll. Istället för att aviseringar visas i mitten av skärmen (som på Android) eller som banners högst upp (som på äldre iOS), integrerar Dynamic Island dem direkt i hårdvaruzonen. Detta minskar distraktion och skapar en känsla av enhetligt utrymme.
Enligt Apple (iOS 17 Adoption Statistics, 2024) är Dynamic Island tillgängligt på 38% av aktiva iPhone. Från och med iPhone 15 (2023) fick alla modeller i serien Dynamic Island, inklusive basmodellerna. I iOS 18 utökade Apple Live Activities API med stöd för nedräkningstimer och sportresultat direkt på Dynamic Island.
Dynamic Island finns tillgängligt på iPhone 14 Pro, iPhone 14 Pro Max, iPhone 15, iPhone 15 Plus, iPhone 15 Pro, iPhone 15 Pro Max, iPhone 16, iPhone 16 Plus, iPhone 16 Pro, iPhone 16 Pro Max. På iPad saknas Dynamic Island. För utveckling med Dynamic Island krävs Xcode 14.1+ och iOS 16.1+.
Dynamic Island stöder tre visningstillstånd: kompakt (compact), minimalt (minimal) och utökat (expanded). Övergången mellan tillstånd animeras med UIKit-animationer och Core Animation. Systemet hanterar själv prioriteringen av aktiviteter: om flera appar försöker visa innehåll samtidigt använder iOS en kö baserad på starttiden för den senaste aktiviteten.
| Tillstånd | Storlek | Innehåll | Exempel |
|---|---|---|---|
| Compact | 49×18 pt | Appikon + systemikon | Timer, musik, samtal |
| Minimal | Upp till 66×18 pt | Ikon + kort text | Navigationsanvisningar, steg |
| Expanded | Upp till 364×160 pt | Fullständig widget med innehåll | Sportresultat, taxistatus |
Kompakt tillstånd — standardvyn för Dynamic Island när en bakgrundsuppgift är aktiv. Visas som ett rundat piller med appikonen till vänster och systemikonen till höger. Som standard startar alla Live Activities i kompakt tillstånd.
Minimalt tillstånd uppstår när två eller flera uppgifter är aktiva samtidigt. Dynamic Island «delas» i två separata element till vänster och höger om kameran. Minimalt tillstånd gör det möjligt att visa två oberoende informationskällor, till exempel taxins ankomsttid och aktuellt spår.
Utökat tillstånd aktiveras genom ett långt tryck på Dynamic Island. I detta läge visas en fullständig widget med anpassningsbart innehåll: rubriker, beskrivningar, förloppsindikatorer, knappar. Det utökade tillståndet stöder rullning och interaktiva element.
ActivityKit — ett Swift-ramverk, introducerat i iOS 16.1, som gör det möjligt för appar att publicera Live Activities på Dynamic Island och Lock Screen. ActivityKit använder en arkitektur baserad på ActivityView och ActivityAttributes: den första definierar innehållstypen, den andra — variabeldata. Ramverket fungerar tillsammans med WidgetKit, men till skillnad från widgetar kan Live Activities uppdateras i realtid utan att öppna appen.
import ActivityKit
import SwiftUI
// Definierar aktivitetsattribut
struct DeliveryAttributes: ActivityAttributes {
public struct ContentState: Codable, Hashable {
var driverName: String
var distanceToArrival: Double
var estimatedMinutes: Int
}
var orderNumber: String
}
// Startar Live Activity
func startDeliveryActivity() {
let initialState = DeliveryAttributes.ContentState(
driverName: "Alexej",
distanceToArrival: 3.5,
estimatedMinutes: 12
)
let attributes = DeliveryAttributes(orderNumber: "ORD-2024-8912")
let activity = try? Activity.request(
attributes: attributes,
contentState: initialState,
pushType: .token
)
}
Live Activities uppdateras via ActivityView, som renderar SwiftUI-innehåll för Dynamic Island. Systemet avgör själv vilken mall som ska användas (kompakt, minimal eller utökad), beroende på Dynamic Islands storlek och antalet aktiviteter. För att uppdatera innehållet, anropa activity.update(using: contentState). För att avsluta — activity.end(dismissalPolicy: .immediate).
ActivityKit stöder push-uppdateringar via APNs (Apple Push Notification Service). Vid start av en Live Activity kan du begära en pushToken och skicka uppdateringar från servern utan att behöva köra appen på enheten. Push-uppdateringar fungerar via activity.pushToken och Activity.pushToStartToken för fjärrstart av Live Activity.
// Uppdatering av Live Activity via Push
func updateActivity(activity: Activity<DeliveryAttributes>) {
let updatedState = DeliveryAttributes.ContentState(
driverName: "Alexej",
distanceToArrival: 1.2,
estimatedMinutes: 4
)
let alertConfiguration = AlertConfiguration(
title: "Budet är nära",
body: "Alexej anländer om 4 minuter",
sound: .default
)
await activity.update(
using: updatedState,
alertConfiguration: alertConfiguration
)
}
AlertConfiguration — en extra parameter som visar en avisering ovanför Dynamic Island vid viktiga uppdateringar (till exempel «Budet har anlänt»). Utan AlertConfiguration uppdateras innehållet tyst, vilket passar för förloppsindikatorer och timers.
Notch (utskärning) — hårdvaruzonen på iPhone X–13, som innehåller framkameran, Face ID-sensorn och högtalaren. Notchen är statisk: dess storlek och form ändras inte och aviseringar visas under den som standardbanners. Dynamic Island använder däremot pixlarna runt utskärningen för att visa innehåll, vilket gör hårdvaruelementet till en del av gränssnittet.
| Kriterium | Dynamic Island | Notch |
|---|---|---|
| Interaktivitet | Stöder tryck, långa tryck, svep | Inte interaktiv |
| Innehållsanpassning | Ändrar form efter sammanhang | Statisk, innehåll under utskärning |
| Live Activities | Inbyggt stöd via ActivityKit | Nej — endast vanliga aviseringar |
| Multitasking | Två samtidiga aktiviteter (vänster och höger) | Endast en aktivitet |
| Tillgänglighet | iOS 16.1+, iPhone 14 Pro och nyare | iOS 11+, iPhone X–13 |
Enligt Apple Human Interface Guidelines (2025) bör Dynamic Island inte användas för reklam eller kontinuerlig visning av statiskt innehåll. Live Activities är endast avsedda för bakgrundsuppgifter med tydlig livscykel: timers, leverans, sport, musik, navigering. Brott mot dessa regler leder till att appen avvisas i App Store Review.
Dynamic Island har en strikt livscykel: en aktivitet börjar med en begäran via Activity.request(), går igenom tillstånden aktiv/pausad/uppdaterad och avslutas med anrop av activity.end(). Systemet kan tvångsavsluta aktiviteten vid minnesbrist (till exempel vid start av kameran). I detta fall får appen ett meddelande via ActivityActivityState.finished.
Gester Dynamic Island hanteras av SwiftUI-innehåll inuti ActivityView. Standardgester: tryck på kompakt tillstånd öppnar appen, långt tryck öppnar utökat tillstånd, svep nedåt stänger utökat tillstånd. Anpassade gester läggs till via SwiftUI-modifierare (onTapGesture, onLongPressGesture) inuti aktivitetsvyn.
När systemet avslutar en Live Activity (eller användaren tar bort den genom att svepa), bör appen hantera finished-tillståndet för att frigöra resurser. Det rekommenderas att prenumerera på Activity.activityStateUpdates och ta bort lokala referenser till aktiviteten efter slutförande.
import ActivityKit
func observeActivityState(activity: Activity<DeliveryAttributes>) {
Task {
for await state in activity.activityStateUpdates {
switch state {
case .active:
print("Activity aktiv på Dynamic Island")
case .dismissed:
print("Activity dold av användaren")
await activity.end(dismissalPolicy: .immediate)
case .finished:
print("Activity avslutad av systemet")
cleanupResources()
@unknown default:
break
}
}
}
}
Apple rekommendation (WWDC 2024, Session 10146): använd inte Dynamic Island för att visa status som inte kräver användarens uppmärksamhet. Varje Live Activity bör ha en tydlig start- och sluttrigger. För bakgrundsuppdateringar utan UI, använd Background Tasks, inte Live Activities.
Vanliga frågor
Dynamic Island finns tillgängligt på iPhone 14 Pro, 14 Pro Max och alla modeller av iPhone 15 och iPhone 16 (inklusive basversionerna). För utveckling krävs iOS 16.1+ och Xcode 14.1. På äldre modeller (iPhone X–13) används den statiska notch-utskärningen som inte stöder Live Activities.
Dynamic Island integrerar aviseringen i skärmens hårdvaruzon utan att täcka innehållet. En vanlig avisering visas som en banner högst upp och försvinner efter några sekunder. Live Activities på Dynamic Island kan förbli aktiva i timmar och uppdateras i realtid (leveransstatus, timer, musik).
Använd push-uppdateringar via APNs. Vid start av en Live Activity, anropa activity.pushToken och skicka token till din server. Servern skickar en update-förfrågan via APNs med ny ContentState. Alternativ — lokal uppdatering via activity.update(using:) från själva appen.
iOS delar automatiskt Dynamic Island i två segment när det finns två aktiva Live Activities. Varje aktivitet visas i minimalt tillstånd till vänster och höger om kameran. Vid långt tryck på ett av segmenten öppnas det utökade tillståndet endast för den appen.
Kontrollera: (1) appen har NSSupportsLiveActivities = YES i Info.plist, (2) ActivityAttributes och ContentState implementerar Codable och Hashable, (3) iOS-version 16.1+, (4) enheten stöder Dynamic Island. För simulator, använd iPhone 14 Pro eller nyare i Xcode.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också