Ana içeriğe atla
Live Activities, iOS uygulamanızın gerçek zamanlı güncellemeleri doğrudan kilit ekranında ve Dynamic Island’da göstermesine olanak tanır. Teslimat takibi, spor skorları veya zamana duyarlı işlemsel güncellemeler için ideal olan bu özellik, kullanıcıları uygulamayı açmadan bilgilendirir.
Android’de Android Live Notifications adlı benzer bir özellik vardır.

Gereksinimler


Kurulum

Bu adımlar, Live Activities’i hızlı bir şekilde kurmanız için size yol gösterir. Daha fazla ayrıntı ve tasarım özelleştirmeleri için Apple’ın Live Activities Geliştirici belgelerine bakın.

1. Widget Extension ekleyin

Xcode’da File > New > Target… > Widget Extension’a gidin.

Xcode'da uygulamanız için yeni bir Widget Extension hedefi ekleyin.

Seçin ve Next’e basın. Bir ad sağlayarak Widget Extension’ı yapılandırın (örnek: OneSignalWidget) ve Include Live Activity’nin seçili olduğundan emin olun. Ardından Finish’e tıklayın.

Bir Live Activity için Widget Extension seçenekleri.

Şemayı etkinleştirmeniz istenirse Don’t Activate’e tıklayın.

Bir Live Activity için Widget Extension seçenekleri.

2. Info.plist’i güncelleyin

Ana hedefinizin Info.plist dosyasında Supports Live Activities anahtarını Boolean olarak ekleyin ve YES olarak ayarlayın.

Info'ya Supports Live Activities anahtarını ekleyin ve değerini Boolean YES olarak ayarlayın

Programatik olarak ayarlarsanız, şöyle görünmelidir:
info.plist
<key>NSSupportsLiveActivities</key>
<true/>
Live Activities’i güncellerken, Apple’ın güncellemenin ne kadar acil olduğunu belirlemek için kullandığı bir “öncelik” ayarlama seçeneğiniz vardır. Apple’ın yüksek öncelik bayrağını çok sık kullanan istekleri kısıtlayacağı dahili eşikleri vardır.Live Activities kullanım durumlarınız daha sık yüksek öncelikli güncellemelere dayanıyorsa, Apple’ın Geliştirici Belgelerinde yönlendirildiği gibi Info.plist dosyanıza NSSupportsLiveActivitiesFrequentUpdates anahtarını Boolean türünde YES olarak ayarlanmış şekilde ekleyebilirsiniz. Live Activity push bütçesini aştığında kullanıcılara bir diyalog sunulacak ve Live Activity’nin devam etmesine izin verirlerse, sorunsuz bir kullanıcı deneyimi için bütçe otomatik olarak artırılacaktır.

3. SDK ekleyin

  • Package Manager
  • Cocoapods
Widget Extension hedefinizde, General > Frameworks, Libraries and Embedded Content altına OneSignalFramework’ü ekleyin:

Widget Extension hedefinize OneSignalFramework'ü ekleyin

4. Widget özniteliklerini ve UI’ı tanımlayın

Struct’ın özelliklerini tanımlamak ve widget UI’da değişiklik yapmak için your-nameLiveActivity.swift dosyasını (örnek: OneSignalWidgetLiveActivity.swift) açın.
  • your-nameAttributes, Live Activity’nizin statik içeriğini açıklar.
  • ContentState, Live Activity’nizin dinamik içeriğini açıklar.
Örneği takip ediyorsanız, aşağıdaki kodu OneSignalWidgetLiveActivity.swift dosyanıza kopyalayıp yapıştırın.
your-nameLiveActivity.swift
import ActivityKit
import WidgetKit
import SwiftUI
// Import the OneSignalLiveActivities module
// If you get an error about the module not being found, return to step 3 and ensure you have added the OneSignalLiveActivities pod correctly.
import OneSignalLiveActivities

// Update to inherit from OneSignalLiveActivityAttributes
// This will be used in your API requests to start a Live Activity
struct OneSignalWidgetAttributes: OneSignalLiveActivityAttributes  {
    // Update to inherit from OneSignalLiveActivityContentState
    public struct ContentState: OneSignalLiveActivityContentState {
        // Dynamic stateful properties about your activity go here!
        var emoji: String
        // Add a reference to OneSignalLiveActivityContentStateData?
        var onesignal: OneSignalLiveActivityContentStateData?
    }
    // Fixed non-changing properties about your activity go here!
    var name: String
    // Add a reference to OneSignalLiveActivityAttributeData
    var onesignal: OneSignalLiveActivityAttributeData
}

struct OneSignalWidgetLiveActivity: Widget {
    var body: some WidgetConfiguration {
      // Update to use `for: the-name-of-your-attributes-struct`
      // This will be used in your API requests to start a Live Activity
        ActivityConfiguration(for: OneSignalWidgetAttributes.self) { context in
            // Lock screen/banner UI goes here
            // Update to show the attributes sent via the payload
            VStack {
                Text("Hello \(context.attributes.name) \(context.state.emoji)")
            }
            .activityBackgroundTint(Color.cyan)
            .activitySystemActionForegroundColor(Color.black)

        } dynamicIsland: { context in
            DynamicIsland {
                // Expanded UI goes here.  Compose the expanded UI through
                // various regions, like leading/trailing/center/bottom
                DynamicIslandExpandedRegion(.leading) {
                    Text("Leading")
                }
                DynamicIslandExpandedRegion(.trailing) {
                    Text("Trailing")
                }
                DynamicIslandExpandedRegion(.bottom) {
                    Text("Bottom \(context.state.emoji)")
                    // more content
                }
            } compactLeading: {
                Text("L")
            } compactTrailing: {
                Text("T \(context.state.emoji)")
            } minimal: {
                Text(context.state.emoji)
            }
            .widgetURL(URL(string: "http://www.apple.com"))
            .keylineTint(Color.red)
        }
    }
}

5. Ana hedef üyeliğine izin verin

your-nameLiveActivity.swift dosyasındaki Target Membership listesine ana uygulama hedefinizi ekleyin. Xcode’da ekranın sağ tarafındaki Inspector panelini açın. Target Membership içinde + düğmesine tıklayın ve ContentView ve OneSignal başlatma kodunuzu içeren ana uygulama hedefinizi seçin.

Ana hedef üyeliğine izin verin

6. AppDelegate’inize setup metodunu ekleyin

OneSignal SDK başlatmasından sonra AppDelegate’inizde OneSignal.LiveActivities.setup’ı çağırın. OneSignalWidgetAttributes’ı Live Activity attributes struct’ınızın adıyla değiştirin.
AppDelegate
// Import the OneSignalLiveActivities module
import OneSignalLiveActivities

// This should be added after initializing the OneSignal SDK
if #available(iOS 16.1, *) {
	OneSignal.LiveActivities.setup(OneSignalWidgetAttributes.self)
  // If you have multiple Live Activities, you can add them here with the setup method
  // OneSignal.LiveActivities.setup(LiveActivityWidgetAttributes-2.self)
}
Bu, ActivityKit async dizilerini kullanarak güncellemeleri yönetir ve raporlar.
Uygulamanızda aşağıdaki dizilerden herhangi birini doğrudan kullanıyorsanız, OneSignal Live Activity davranışına müdahale edebilir:
  • activityStateUpdates
  • pushTokenUpdates
  • pushToStartTokenUpdates
  • activityUpdates

Bir Live Activity başlatma

Bir cihazda Live Activity başlatmak için 2 seçenek vardır:
  • Push-to-start
  • Trigger-in-app
Bir Push To Start API isteği gönderin. Tüm adların ve kimliklerin widget yapılandırmanızla tam olarak eşleştiğinden emin olun (parametreler büyük/küçük harfe duyarlıdır). Herhangi bir şey eksikse veya yanlış eklenmişse, widget’ı başlatmaya çalışırken sorunlarla karşılaşabilirsiniz.İşte yukarıdaki örnek için çalışacak bir örnek istek.Değiştirin:
  • YOUR_APP_ID’yi OneSignal App ID’niz ile.
  • YOUR_APP_API_KEY’i OneSignal API anahtarınız ile.
  • OneSignalWidgetAttributes’ı Widget Attributes struct’ınızın adıyla.
    curl
    curl --location 'https://api.onesignal.com/apps/YOUR_APP_ID/activities/activity/OneSignalWidgetAttributes' \
    --header 'Authorization: key YOUR_APP_API_KEY' \
    --header 'Content-Type: application/json' \
    --data '{
        "event": "start",
        "activity_id": "push-to-start",
        "included_segments": [
            "Subscribed Users"
        ],
        "event_attributes": {
            "name": "World"
        },
        "event_updates": {
            "emoji":"🤩"
        },
        "name": "Live Activities Test",
        "contents": {
            "en": "A push started this Live Activity"
        },
        "headings": {
          "en": "Live Activity Started"
        }
      }'
    
Sağlanan örnek kodu takip ediyorsanız, cihazınızın kilit ekranında Live Activity’yi görmelisiniz.

Kilit ekranında Live Activity

Push-to-start ile bir Live Activity’yi başarıyla başlattınız!Kullanıcıların güncellemeleri almaya devam etmek için “Allow” seçmesi gerekecektir.

Bir Live Activity’yi güncelleme

Aktif widget’ları güncellemek için Update Live Activity API’yi kullanın. Activity başlatılırken kullanılan activity_id ile eşleştirin. Bu örnek istek push-to-start widget’ını güncelleyecektir çünkü tanımladığımız push-to-start başlıklı activity_id’ye sahiptir. Click-to-start widget’ını güncellemek için, istek yolunu push-to-start yerine click-to-start kullanacak şekilde güncelleyin.
curl
curl --location 'https://api.onesignal.com/apps/YOUR_APP_ID/live_activities/push-to-start/notifications' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: key YOUR_API_KEY' \
--data '{
    "event": "update",
    "event_updates": {
        "emoji": "😎"
    },
    "contents": {
        "en": "A push updated this Live Activity"
    },
    "name": "Live Activity Updated"
}'

Live Activity Güncellendi

Bir Live Activity’yi başarıyla güncellediniz!Bir Live Activity’yi güncelleme hakkında daha fazla bilgi için Update Live Activity API’ye bakın.

Bir Live Activity’yi sonlandırma

Aynı Update Live Activity API’yi kullanarak "event": "end" ayarlayarak bir Live Activity’yi sonlandırabiliriz.
curl
curl --location 'https://api.onesignal.com/apps/YOUR_APP_ID/live_activities/my_activity_id/notifications' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: key YOUR_API_KEY' \
--data '{
    "event": "end",
    "event_updates": {
        "emoji": "👋"
    },
    "contents": {
        "en": "A push ended this Live Activity"
    },
    "name": "Live Activity Ended"
}'
Bir Live Activity’nin sona erebileceği diğer yollar:
  • SDK’mızın exit() metodunu kullanın.
  • Kullanıcı Live Activity’yi manuel olarak kaydırarak kapatır.
  • Kullanıcı iOS Ayarlarında Live Activities için izni iptal eder.

Live Activity Sonlandı

Live Activity’yi başarıyla sonlandırdınız ve örneği tamamladınız!

En iyi uygulamalar ve öneriler

Tasarım değerlendirmeleri

  • Apple’ın Live Activities İnsan Arayüzü Yönergelerini takip edin.
    • Hızlı bir bakışta anlaşılması kolay olması için önemli bilgilere öncelik verin.
    • Uygulamanıza Dynamic Island’a dikkat çeken öğeler eklemeyin.
    • Kenar boşlukları kullanın ve öğeler arasında boşluk bırakın.
    • Arka plan için kalın bir renk kullanın. Hem Light hem de Dark mode için tasarlayın.

İşlevsellik

Yedek mesaj ayarlama

  • Kullanıcının live activity’sine güncelleme alamadığı belirli durumlarda, biri başlatıldıktan sonra, uygulamayı açmak devam etmek için onları yenilemelidir
    • Bunu hesaba katmak için, stale date’i gelecekte bir tarih ve saate, kullanıcıya ilk güncellemenizi göndereceğinizi bildiğiniz bir zamandan sonraya ayarlarsınız ve güncellemeyi almayanlar yedek mesajı görürler.
    • Widget UI’ınızda yedek mesajı göstermek için bu “stale” durumunu dinleyebilirsiniz:
    swift
      struct ptsLiveActivity: Widget {
      var body: some WidgetConfiguration {
          ActivityConfiguration(for: ptsAttributes.self) { context in
              //This will flip to true after the stale date
              let isStale = context.isStale 
              if !isStale{
                  VStack {
                      Text("\(context.attributes.name) \(context.state.emoji)")
                          .activityBackgroundTint(Color.cyan)
                          .activitySystemActionForegroundColor(Color.black)
                  }
              }  else {
              //If the message is stale, we request the user clicks the widget to open the app
                  VStack {
                      Text("Something went wrong, please click to refresh")
                  }
              }
      //... Rest of the widget UI
      }
    
}



---

## SSS

### Yüksek öncelikli güncellemeler için bütçe nedir?

Apple, yüksek öncelikli (`priority: 10`) güncellemeler için sabit bir sınır sağlamaz, ancak dinamik bir sistem düzeyinde bütçe uygularlar. Kısa bir süre içinde çok fazla yüksek öncelikli güncelleme göndermek, güncellemelerin geciktirildiği veya düşürüldüğü kısıtlamaya neden olabilir.

Kısıtlama riskini azaltmak için:
- Öncelik düzeylerinin karışımını kullanın: Apple, denge için hem `priority: 5` (standart) hem de `priority: 10` (yüksek) kullanılmasını önerir.
- `priority: 10`'u yalnızca zamana duyarlı veya kritik güncellemeler için ayırın (örn. sipariş durumu değişiklikleri, oyun skorları).

Kullanım durumunuz sık güncellemeler gerektiriyorsa:
- Uygulamanızın `Info.plist` dosyasına `NSSupportsLiveActivitiesFrequentUpdates` anahtarını Boolean `YES` olarak ayarlanmış şekilde ekleyin.
- Bu bütçe aşıldığında, iOS kullanıcıdan ek güncellemelere izin vermesini isteyebilir. Kullanıcı kabul ederse, Apple sorunsuz bir deneyim sürdürmek için izin verilen güncelleme sınırını otomatik olarak genişletecektir.

Daha fazla ayrıntı için [Apple'ın Geliştirici Belgelerine](https://developer.apple.com/documentation/activitykit/starting-and-updating-live-activities-with-activitykit-push-notifications#Determine-the-update-frequency) bakın.

### Ana uygulamadan Live Activity güncellemelerini okuyabilir miyim?

Evet. Hata ayıklama veya UI senkronizasyonu için güncellemeleri gözlemleyebilirsiniz:

```swift
Task {
    for await content in activity.contentUpdates {
        print("LA activity id: \(activity.id), content update: \(content.state)")
    }
}
// Example output:
// LA activity id: EFE6D54D-F7E1-45EF-9514-4C2598F8DED2, content update: ContentState(message: "My message from payload")
Yaşam döngüsü değişikliklerini izleyin:
Task {
    for await state in activity.activityStateUpdates {
        print("LA state update: \(state)")
        //If you wanted to do something based on the state, you would use this:
      	if state != ActivityState.active {
            //Do something here
        }
    }
}

// Example output 1 - LA ended, but still visible
// LA state update: active

/* State can be equal to 4 possible values on the ActivityState enum
active, dismissed, ended, and stale
*/

API abone sınırını aştığımı belirten bir hata mesajıyla 400 döndürdü. Ne yapmalıyım?

Push abone sayınız planınız için Push Abonelerinden fazlaysa, lütfen hesabınızı bir sonraki plana yükseltin veya support@onesignal.com ile iletişime geçin. En son plan ayrıntıları için lütfen buraya bakın.

Hem push hem de Live Activities göndermeyi nasıl önlerim?

Uygulamanız zaten bir dizi Push Bildirimi gönderiyor olabilir ve tasarladığınız Live Activity bu Push Bildirimlerine olan ihtiyacı ortadan kaldırabilir. Örneğin, Push aracılığıyla skor güncellemeleri gönderiyorsanız, bunu bir Live Activity aracılığıyla değiştirebilirsiniz. Kullanıcılarınızın çok fazla mesaj almadığından emin olmak için, kullanıcınız bir Live Activity için katıldığında bir veri etiketi eklemenizi öneririz. Bu veri etiketini ekleyerek, aynı veya benzer içerik içerebilecek push mesajlarından bu veri etiketine sahip kullanıcıları hariç tutabilirsiniz. Veri Etiketleri ve Segmentler hakkında daha fazla bilgi edinin.

Sorun giderme

Alıcı yok

Bir Live Activity başlatmaya veya güncellemeye çalışırken kullanıcılarınızın bulunabilmesi için activity türü, widget ve cURL isteğinin hepsinin eşleşen değerlere sahip olduğundan emin olmalısınız.
  1. Sunucuya doğru biçimlendirilmiş bir istek gönderdiğinizden emin olmak için isteğinizdeki yol parametrelerini kontrol edin. Uygulama Kimliği, OneSignal.Initialize metodunda kullanılan Uygulama Kimliğiniz ile eşleşmeli ve activity türü, Live Activity dosyanızda tanımladığınız türle eşleşmelidir.
  2. Push To Start API isteğinin gövdesinde aşağıdaki parametrelere sahip olmalısınız:
  • event: "start"
  • event_updates: Activity türü altında struct’ınızda tanımladığınız ve widget’ınızda kullanılan dinamik veri. Harf büyüklüğü ve değişkenlerin istek, tür ve widget arasında eşleştiğinden emin olun.
  • event_attributes: Statik veri Event Updates ile aynı mantığı izler ve kullanımdaki tüm değişkenleri içermeli ve live activity’nin tüm kısımları ve istek arasında eşleşmelidir
  • activity_id: Bu, widget’a bir kimlik atayacaktır ve kullanıcının cihazında başlatıldıktan sonra activity’yi güncellemek için kullanılacak olan şeydir.
  • name: Live Activity Adı.
  • contents: Push göndermek için gereken mesaj içeriği.
  • headings: Push göndermek için gereken mesaj başlığı.
  • included_segments gibi bir hedefleme parametresi. Mevcut seçenekler.

Activity gönderildi, ancak alınmadı

  1. İsteğin doğru biçimlendirildiğinden emin olun. Widget’ta kullanılan herhangi bir alan atlanırsa, activity beklendiği gibi başlatılamayabilir veya güncellenemeyebilir.
  2. API isteğinizde, ayarladığınız priority düzeyini belirleyin. Bunu 10 (en yüksek öncelik) olarak ayarlıyorsanız, 5’e düşürmeyi deneyin ve tekrar test edin. Apple, kendi dahili hız limitleri uyarınca çok sık gönderilen istekleri kısıtlayacaktır.
Kullanım durumunuz daha sık güncellemelere dayanıyorsa, Apple’ın Geliştirici Belgelerinde yönlendirildiği gibi Info.plist dosyanıza NSSupportsLiveActivitiesFrequentUpdates anahtarını Boolean türünde YES olarak ayarlanmış şekilde ekleyin. Live Activity push bütçesini aştığında kullanıcıya bir diyalog sunulacak ve Live Activity’nin devam etmesine izin verirlerse, sorunsuz bir kullanıcı deneyimi için bütçe otomatik olarak artırılacaktır.
Need help?Chat with our Support team or email support@onesignal.comPlease include:
  • Details of the issue you’re experiencing and steps to reproduce if available
  • Your OneSignal App ID
  • The External ID or Subscription ID if applicable
  • The URL to the message you tested in the OneSignal Dashboard if applicable
  • Any relevant logs or error messages
We’re happy to help!