Live Activity iPhone kilit ekranında ve Dynamic Island'da gerçek zamanlı bilgi gösteren dinamik bir widget'tır: teslimat durumu, spor skorları, zamanlayıcılar ve müzik çalma. WidgetKit ile birlikte ActivityKit (Swift, iOS 16.1+) aracılığıyla uygulanır. Live Activity yerel olarak veya push bildirimleri yoluyla güncellenir, birden çok durumu destekler ve olay sona erdikten sonra sistem tarafından sonlandırılır. Daha fazla bilgi için ActivityKit Documentation adresine bakın.
Önemli Noktalar
Live Activity WidgetKit'in bir uzantısıdır ve iPhone kilit ekranında ve Dynamic Island'da dinamik içerik görüntüler. Sistem zamanlayıcısında güncellenen statik bir widget'ın aksine, Live Activity uygulama tarafından başlatılır ve sınırlı bir süre yaşar — aktif Activity için 8 saate kadar ve tamamlandıktan sonra 4 saate kadar. Kullanıcı, cihazın kilidini açmadan güncel verileri görür: teslimat sipariş durumu, bir takside varış noktasına mesafe, maç sonuçları veya antrenman ilerlemesi.
ActivityKit iOS 16.1'de tanıtılan, Live Activities ile çalışmak için bir framework'tür. Activities talep etme, güncelleme ve sonlandırma için API sağlar. Activity, içerik ve duruma sahip bir nesnedir. İçerik (ActivityContent) statik verileri tanımlarken, durum (ActivityState) zamanla değişen dinamik verileri tanımlar. Yeni durumun ne zaman render edileceğine sistem kendisi karar verir — bu pil tasarrufu sağlar ve yumuşak animasyonlar garanti eder.
Her Live Activity bir ActivityID ile benzersiz şekilde tanımlanır ve onu oluşturan uygulama sürecine bağlıdır. Sistem, bellek düşük veya pil şarjı yetersiz olduğunda Activity'yi sonlandırabilir. Geliştirici, ActivityKit delegesi aracılığıyla zorla sonlandırma bildirimi alır ve geri yükleme için son durumu kaydedebilir.
Live Activity Mimarisi iki framework üzerine kurulmuştur: WidgetKit SwiftUI görünümü oluşturmadan sorumludur, ActivityKit Activity yaşam döngüsünden sorumludur. Geliştirici, LiveActivityConfiguration desteğiyle WidgetBundle oluşturur. Her yapılandırma, veri türünü (Attributes ve State) ve sistemin kilit ekranında ve Dynamic Island'da oluşturduğu SwiftUI görünümünü tanımlar. Veriler, içerik için let alanları ve durum için var alanları olan bir struct olan ActivityAttributes aracılığıyla iletilir.
| Bileşen | Amaç | API |
|---|---|---|
| Attributes | Tüm Activity'nin statik verileri | let name: String, let icon: String |
| ContentState | Güncellemede değiştirilebilen dinamik durum | var progress: Double, var status: Status |
| Activity | Activity talep ve yönetim nesnesi | Activity.request(attributes:content:) |
| PushToken | Sunucu push güncellemeleri için token | activity.pushToken publisher |
| ActivityUI | Kilit ekranı ve Dynamic Island için SwiftUI görünümü | LockScreenView, ExpandedView, CompactView |
Activity Yaşam Döngüsü üç aşamadan oluşur: aktif (sistem görüntüler ve günceller), son (Activity sonlandırıldı ancak UI 4 saat boyunca görünür), kaldırıldı (sistem UI'yi kaldırır). Uygulama Activity'yi herhangi bir zamanda sonlandırabilir. Sistem de Activities'leri zorla sonlandırır — örneğin, cihaz yeniden başlatıldığında veya 8 saatlik sınır dolduğunda.
import ActivityKit
struct DeliveryAttributes: ActivityAttributes {
public struct ContentState: Codable & Hashable {
var status: DeliveryStatus
var estimatedMinutes: Int
}
var orderNumber: String
var restaurantName: String
}
WidgetBundle @main makrosu aracılığıyla Live Activity'yi kaydeder: widget, LiveActivityConfiguration dahil yapılandırma listesi döndürür. Bu yapılandırmaya dayanarak sistem, hangi veri türlerinin bekleneceğini ve UI'nin farklı durumlarda nasıl render edileceğini bilir — Dynamic Island için kompakt, minimum ve genişletilmiş.
Activity Oluşturma ActivityKit'e bir taleple başlar. Uygulama, başlangıç verileriyle Activity.request(attributes:content:pushType:) çağrısını yapar. Sistem, cihazda Dynamic Island'ın kullanılabilir olup olmadığını kontrol eder ve bir Activity nesnesi döndürür. Aktif Activity sınırı aşılırsa talep başarısız olabilir — genellikle aynı anda 5'ten fazla olamaz. Başarılı bir talepten sonra sistem, widget'ı kilit ekranında ve mümkünse Dynamic Island'da görüntüler.
let attributes = DeliveryAttributes(
orderNumber: "A-1234",
restaurantName: "Pizza House"
)
let initialState = DeliveryAttributes.ContentState(
status: DeliveryStatus.preparing,
estimatedMinutes: 30
)
do {
let activity = try await Activity<DeliveryAttributes>.request(
attributes: attributes,
content: ActivityContent(state: initialState, staleDate: nil),
pushType: .token
)
print("Activity started: \(activity.id)")
} catch {
print("Failed: \(error)")
}
Live Activity için SwiftUI Görünümü WidgetKit'ten LockScreenView, ExpandedView ve CompactView yapılarını kullanır. Görünüm, mevcut öznitelikler ve durumla birlikte bağlamı (ActivityViewContext) alır. Sistemden yeni durum geldiğinde görünüm otomatik olarak güncellenir. Live Activity yalnızca sınırlı bir SwiftUI bileşen setini destekler — Text, Image, HStack, VStack ve birkaç değiştirici.
Her Live Activity Görünümü hafif ve hızlı olmalıdır — sistem ağır görünümleri oluşturmayı reddeder. Oluşturma süresi sınırı kare başına 30 ms'dir. Animasyonlar, durumlar arasındaki sistem geçişleriyle sınırlıdır — Live Activity'de özel animasyonlar mevcut değildir. Oluşturma, kilit ekranı yanıt verme önceliğiyle WidgetKit arka plan sürecinde gerçekleştirilir.
Yerel Güncelleme — uygulama, activity.update(using:) çağrısı yaparak Activity durumunu günceller. Yöntem, yeni bir ContentState ve güncellemede bildirim göstermek için isteğe bağlı AlertConfiguration kabul eder. Yerel güncellemeler hızlıdır — sistem, sonraki oluşturma döngüsünde görünümü yeniden çizer, genellikle 1-2 saniye içinde. Sık güncellemeler (zamanlayıcı, kronometre) için yerel modu kullanın — push'tan daha güvenilir ve hızlıdır.
let updatedState = DeliveryAttributes.ContentState(
status: DeliveryStatus.outForDelivery,
estimatedMinutes: 10
)
await activity.update(
ActivityContent<DeliveryAttributes.ContentState>(
state: updatedState,
staleDate: Date().addingTimeInterval(60)
),
alertConfiguration: AlertConfiguration(
title: "Order out for delivery",
body: "Arriving in 10 min"
)
)
Push Güncellemeleri — sunucu, JSON formatında yeni durumla bir ActivityKit push bildirimi gönderir. Bunun için uygulama, activity.pushToken yayımcısından bir pushToken alır ve sunucuya iletir. Sunucu, yeni ContentState içeren bir payload ile APNs'ye POST isteği gönderir. Sistem push'u alır, durumu çözer ve uygulama katılımı olmadan Live Activity'yi günceller — bu, uygulama kapalıyken bile Activity'nin güncellenmesine olanak tanır.
Push güncellemeleri, seyrek güncellemeler (her 5-10 dakikada bir teslimat durumu) için daha verimlidir — uygulamanın ağ bağlantısını sürdürmesi gerekmez. Her 1-2 saniyede bir sık güncellemeler için yerel yöntemi kullanın. Sunucu payload'ı yalnızca ContentState'in değiştirilebilir alanlarını içerir — statik Attributes verileri yalnızca Activity oluşturulurken gönderilir.
Dynamic Island iPhone 14 Pro, 15 Pro ve sonrasında Live Activity içeriğine uyum sağlayan bir donanım-yazılım alanıdır. Sistem, Activity'yi otomatik olarak üç modda görüntüler: kompakt (kesiğin solunda simge + kısa metin), minimum (yalnızca simge) ve genişletilmiş (bilgi içeren 300pt dikdörtgen). Geliştirici bu modları doğrudan kontrol etmez — sistem, öncelik ve kullanılabilir alana göre modu seçer.
struct DeliveryLiveActivity: Widget {
var body: some WidgetConfiguration {
ActivityConfiguration(for: DeliveryAttributes.self) { context in
LockScreenView(context: context)
} dynamicIsland: { context in
DynamicIsland {
DynamicIslandExpandedContent {
ExpandedView(context: context)
}
} compactLeading: {
CompactLeadingView(context: context)
} compactTrailing: {
CompactTrailingView(context: context)
} minimal: {
MinimalView(context: context)
}
}
}
}
Dynamic Island etkileşim destekler — kullanıcı alana dokunur ve uygulamaya girer veya genişletilmiş görünümü açar. Kompakt moda dokunmak genişletilmiş moda geçer ve sola kaydırmak Activity'yi minimum moda alır. Genişletilmiş moddaki düğmeler (duraklat/iptal) SwiftUI'den Link aracılığıyla işlenir — sistem, deep link URL'si ile uygulamayı başlatır, işleme UIApplicationDelegate'te yapılır.
Dynamic Island Sınırlamaları: genişletilmiş mod genişliği 300pt'ye kadar, kompakt metin 30 karaktere kadar. Renkler ve yazı tipleri sistem temasıyla eşleşir — özelleştirme sınırlıdır. Modlar arasındaki geçiş animasyonları sistem tanımlıdır ve özelleştirilemez. Birden çok uygulamanın aktif Activity'si varsa, Dynamic Island bunları başlatma zamanı ve içerik türüne göre önceliklendirerek görüntüler.
Sıkça Sorulan Sorular
Normal WidgetKit widget'ı statik bilgi görüntüler ve minimum 15-30 dakika aralıklarla sistem zamanlayıcısında güncellenir. Live Activity, kilit ekranında ve Dynamic Island'da gerçek zamanlı dinamik veri gösterir. Live Activity uygulama tarafından başlatılır, 8 saate kadar yaşar ve olay sona erdikten sonra sistem tarafından sonlandırılır; kalıcı olarak var olan widget'ın aksine.
Live Activity iki güncelleme modunu destekler: yerel — uygulama ActivityKit API'si aracılığıyla herhangi bir zamanda durumu günceller ve push güncellemesi — sunucu, sistemin widget'ın yeni durumuna dönüştürdüğü bir ActivityKit push bildirimi gönderir. Pil zayıf olduğunda, sistem şarj bağlanana kadar Live Activity'yi dondurabilir.
Live Activities, iOS 16.1 ve sonrası olan iPhone'larda kullanılabilir. iPhone 14 Pro ve sonrasında Live Activity ayrıca Dynamic Island'da görüntülenir. iPad'de Live Activity yalnızca kilit ekranında desteklenir — iPad'de Dynamic Island yoktur. Apple Watch, Live Activities'i doğrudan desteklemez ancak tamamlanma bildirimlerini görüntüleyebilir.
Sistem, aktif Live Activities sayısını sınırlar — genellikle tüm uygulamalar için aynı anda 5'ten fazla olamaz. Sınırın ötesinde başlatma girişimi ActivityKit'ten hata döndürür. Her Live Activity birden çok duruma sahip olabilir — örneğin, beklemede, yolda, yemek siparişi için teslim edildi. Tamamlandıktan sonra Activity, UI'de 4 saat daha kalır.
Evet, uygulama bildirim göndermek için izin istemelidir — Live Activity sistem bildirim kanalını kullanır. Kullanıcı, ayarlardan belirli bir uygulama için Live Activity'yi devre dışı bırakabilir. İlk başlatmada ActivityKit izin isteyen bir diyalog gösterir. İzin olmadan Activity talebi başarısız olur.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun