> ## Documentation Index
> Fetch the complete documentation index at: https://documentation.onesignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Live Activities geliştirici kurulumu

> iOS Live Activities'i OneSignal ile kurarak kilit ekranında ve Dynamic Island'da gerçek zamanlı güncellemeleri görüntüleyin.

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.

<Note> Android'de [Android Live Notifications](./android-live-notifications) adlı benzer bir özellik vardır. </Note>

## Gereksinimler

* Yerel iOS (Swift/Objective-C) kullanıyorsanız [iOS SDK kurulumu](./ios-sdk-setup)'nu takip edin.
  * Bir sarmalayıcı SDK (React Native, Flutter, Unity, vb.) kullanıyorsanız [Mobil SDK kurulumu](./mobile-sdk-setup)'nu ve ardından [Çapraz platform Live Activity SDK Kurulumu](./cross-platform-live-activity-setup)'nu takip edin.
* **push-to-start** desteği için OneSignal iOS SDK sürüm 5.2.0+ ([sürüm notlarına bakın](https://github.com/OneSignal/OneSignal-iOS-SDK/releases/tag/5.2.0)).
* **tıklama takibi** ve **Onaylanmış Teslimat** için OneSignal iOS SDK sürüm 5.2.15+
* iOS 16.1+ ve iPadOS 17+
* Bir [.p8 APNs anahtarı](./ios-p8-token-based-connection-to-apns) kullanın. Apple, Live Activities ile p12 sertifikalarını desteklemiyor.
* Xcode 14 veya üzeri

***

## 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](https://developer.apple.com/design/human-interface-guidelines/live-activities) bakın.

### 1. Widget Extension ekleyin

Xcode'da **File > New > Target... > Widget Extension**'a gidin.

<Frame caption="Xcode'da uygulamanız için yeni bir Widget Extension hedefi ekleyin.">
  <img src="https://mintcdn.com/onesignal/FXJz6yFfOqztaEND/images/live-activities/live-activity-widget-extension.png?fit=max&auto=format&n=FXJz6yFfOqztaEND&q=85&s=60a52d6484203c4d6af21bc3a7da5e62" width="2166" height="1488" data-path="images/live-activities/live-activity-widget-extension.png" />
</Frame>

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.

<Frame caption="Bir Live Activity için Widget Extension seçenekleri.">
  <img src="https://mintcdn.com/onesignal/yt4lRKoquAlWvRvF/images/live-activities/OneSignalWidget.png?fit=max&auto=format&n=yt4lRKoquAlWvRvF&q=85&s=47412314963f6fbd58fd2c7d3a529322" width="2166" height="1488" data-path="images/live-activities/OneSignalWidget.png" />
</Frame>

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

<Frame caption="Şema etkinleştirme istemi — Don't Activate'i seçin.">
  <img src="https://mintcdn.com/onesignal/yt4lRKoquAlWvRvF/images/live-activities/la-scheme-activation.png?fit=max&auto=format&n=yt4lRKoquAlWvRvF&q=85&s=d3a2207ff2b5988c63c2abd631a72541" width="2166" height="1488" data-path="images/live-activities/la-scheme-activation.png" />
</Frame>

### 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.

<Frame caption="Info'ya Supports Live Activities anahtarını ekleyin ve değerini Boolean YES olarak ayarlayın">
  <img src="https://mintcdn.com/onesignal/yt4lRKoquAlWvRvF/images/live-activities/info-la-setting.png?fit=max&auto=format&n=yt4lRKoquAlWvRvF&q=85&s=e839231401651b71d0ae8d48614ec130" width="2166" height="1488" data-path="images/live-activities/info-la-setting.png" />
</Frame>

Programatik olarak ayarlarsanız, şöyle görünmelidir:

```xml info.plist theme={null}
<key>NSSupportsLiveActivities</key>
<true/>
```

<Note>
  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](https://developer.apple.com/documentation/activitykit/starting-and-updating-live-activities-with-activitykit-push-notifications#Determine-the-update-frequency) 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.
</Note>

### 3. SDK ekleyin

<Tabs>
  <Tab title="Package Manager">
    <Note>
      Bir sarmalayıcı SDK (örneğin **Flutter**) kullanıyorsanız ve SPM etkinse, bu adımı atlayabilirsiniz. OneSignal paketi zaten çözülmüş olup tüm hedefler için kullanılabilir.
    </Note>

    Widget Extension hedefinizde, **General > Frameworks, Libraries and Embedded Content** altına `OneSignalFramework`'ü ekleyin:

    <Frame caption="Widget Extension hedefinize OneSignalFramework'ü ekleyin">
      <img src="https://mintcdn.com/onesignal/yt4lRKoquAlWvRvF/images/live-activities/add-one-signal-framework.png?fit=max&auto=format&n=yt4lRKoquAlWvRvF&q=85&s=386781616958e5a80a5cfec5ee143dcb" width="2392" height="1488" data-path="images/live-activities/add-one-signal-framework.png" />
    </Frame>
  </Tab>

  <Tab title="Cocoapods">
    Projenizin Targets listesinde widget extension hedefinizin adını bulun. Örneğin adı `OneSignalWidgetExtension`'dır.

    <Frame caption="Widget extension hedefinizin adını bulun">
      <img src="https://mintcdn.com/onesignal/yt4lRKoquAlWvRvF/images/live-activities/cocoapods-la-extension-name.png?fit=max&auto=format&n=yt4lRKoquAlWvRvF&q=85&s=850a91387539587802306a66771435eb" width="2166" height="1488" data-path="images/live-activities/cocoapods-la-extension-name.png" />
    </Frame>

    `Podfile` dosyanızı açın ve aşağıdaki kodu ekleyin. `OneSignalWidgetExtension`'ı widget extension hedefinizin adıyla değiştirin.

    <CodeGroup>
      ```ruby Podfile theme={null}
      target 'OneSignalWidgetExtension' do
        use_frameworks!
        pod 'OneSignal/OneSignal', '>= 5.0.0', '< 6.0'
      end
      ```

      ```ruby Full Podfile example theme={null}
      # Uncomment the next line to define a global platform for your project
      # platform :ios, '9.0'

      target 'Demo Momenta' do
        # Comment the next line if you don't want to use dynamic frameworks
        use_frameworks!
        pod 'OneSignal/OneSignal', '>= 5.0.0', '< 6.0'
        pod 'OneSignal/OneSignalInAppMessages', '>= 5.0.0', '< 6.0'
      end

      target 'OneSignalNotificationServiceExtension' do
        use_frameworks!
        pod 'OneSignal/OneSignal', '>= 5.0.0', '< 6.0'
      end

      target 'OneSignalWidgetExtension' do
        use_frameworks!
        pod 'OneSignal/OneSignal', '>= 5.0.0', '< 6.0'
      end
      ```
    </CodeGroup>

    Xcode'u kapatın ve `OneSignalLiveActivities` pod'unu yüklemek için `pod repo update && pod install` komutunu çalıştırın.

    Bunu yaptıktan sonra "No such module 'OneSignalLiveActivities'" hatasını görmeye devam ederseniz, bağımlılığı manuel olarak **"Widget Extension Target" > General > Frameworks and Libraries > + simgesi**'ne giderek ekleyebilirsiniz. `OneSignalLiveActivities` framework'ünü seçin:

    <Frame caption="Bağımlılıkları manuel olarak ekleyin">
      <img src="https://mintcdn.com/onesignal/YOTSrtBSoqdrJ37A/images/docs/427d54ef84e97edaf0a7c3b158b48b3bec7305fb1764db9dd4ef7c340d77bc6c-image.png?fit=max&auto=format&n=YOTSrtBSoqdrJ37A&q=85&s=f7ba0aa4234ef69ebd7820ef5e50a18b" width="1273" height="881" data-path="images/docs/427d54ef84e97edaf0a7c3b158b48b3bec7305fb1764db9dd4ef7c340d77bc6c-image.png" />
    </Frame>
  </Tab>
</Tabs>

### 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.

```swift your-nameLiveActivity.swift theme={null}
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

<Note>
  Bu adım yalnızca özel öznitelikler (örneğin, `OneSignalWidgetAttributes`) kullanırken gereklidir. `DefaultLiveActivityAttributes` kullanıyorsanız, bu adımı atlayın — tür OneSignal SDK tarafından sağlanmaktadır ve ana uygulama hedefinizden zaten erişilebilir.
</Note>

`your-nameLiveActivity.swift` dosyasındaki **Target Membership** listesine ana uygulama hedefinizi ekleyin. Bu, ana uygulama hedefinin kurulum çağrısında (Adım 6) özel öznitelik yapınıza başvurabilmesi için gereklidir.

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.

<Frame caption="Ana hedef üyeliğine izin verin">
  <img src="https://mintcdn.com/onesignal/FXJz6yFfOqztaEND/images/live-activities/target-membership.png?fit=max&auto=format&n=FXJz6yFfOqztaEND&q=85&s=3315253623dfec6c13a56ff30a156772" width="2392" height="1488" data-path="images/live-activities/target-membership.png" />
</Frame>

### 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.

```swift AppDelegate theme={null}
// 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.

<Warning>
  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
</Warning>

***

## Bir Live Activity başlatma

Bir cihazda Live Activity başlatmak için 2 seçenek vardır:

<Tabs>
  <Tab title="Push-to-start">
    Bir [Push To Start API isteği](/reference/start-live-activity) 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 theme={null}
      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.

    <Frame caption="Kilit ekranında Live Activity">
      <img src="https://mintcdn.com/onesignal/FXJz6yFfOqztaEND/images/live-activities/live-activity-lock-screen.jpg?fit=max&auto=format&n=FXJz6yFfOqztaEND&q=85&s=8abc098ce8772b1c457e5f1effc8c14e" width="900" height="385" data-path="images/live-activities/live-activity-lock-screen.jpg" />
    </Frame>

    <Check>
      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.
    </Check>
  </Tab>

  <Tab title="Trigger-in-app">
    Bir kullanıcının uygulamanızla etkileşim halindeyken bir Live Activity tetiklemesini sağlayabilirsiniz.

    Örneğin, bir kullanıcının devam eden aktif bir olayı olduğunda (sipariş verdiler, oyun devam ediyor, bir etkinlik başlamak üzere, vb.) ve uygulamanızı açtığında, otomatik olarak bir Live Activity görüntüleyebilirsiniz.

    Bu örnekte Live Activity'yi manuel olarak başlatmak için bir düğme kullanacağız.

    ```swift theme={null}
    import SwiftUI
    import ActivityKit
    import OneSignalFramework
    import OneSignalLiveActivities

    struct ContentView: View {
      @StateObject private var viewModel = LiveActivityViewModel()

      var body: some View {
        VStack {
          Button("Start Live Activity") {
            viewModel.startLiveActivity()
          }
        }
      }
    }

    class LiveActivityViewModel: ObservableObject {

      func startLiveActivity() {
        let osAttributes = OneSignalLiveActivityAttributeData.create(activityId: "click-to-start")
        let attributes = OneSignalWidgetAttributes(name: "OneSignal", onesignal: osAttributes)
        let contentState = OneSignalWidgetAttributes.ContentState(emoji:"🤩", onesignal: nil)
        do {
            let activity = try Activity<OneSignalWidgetAttributes>.request(
                attributes: attributes,
                contentState: contentState,
                pushType: .token)
        } catch {
            print(error.localizedDescription)
        }
      }
    }
    ```

    Düğmeye tıklandığında Live Activity başlatılacaktır.
  </Tab>
</Tabs>

***

## Live Activity tıklamalarını izleme

OneSignal'ın tıklama izlemeyi uygulayarak kullanıcıların Live Activities ve Dynamic Islands'a ne zaman dokunduklerini izleyin. Bu, etkileşimi ölçmenizi ve isteğe bağlı olarak kullanıcıları uygulamanızdaki belirli içeriklere derin bağlantıyla yönlendirmenizi sağlar.

### Adım 1: Widget'ınıza tıklama izleme ekleme

Live Activity widget'ınızdaki tıklamaları izlemek istediğiniz herhangi bir UI bileşenine `.onesignalWidgetURL()` değiştiricisini ekleyin:

```swift theme={null}
import OneSignalLiveActivities

struct ExampleAppFirstWidget: Widget {
    var body: some WidgetConfiguration {
        ActivityConfiguration(for: ExampleAppFirstWidgetAttributes.self) { context in
            VStack {
                Spacer()
                Text("Sample Text " + context.attributes.title).font(.headline)
                // Other UI code
            }
            .onesignalWidgetURL(URL(string: "myapp://settings"), context: context)
            // Pass nil if you don't need deep linking: .onesignalWidgetURL(nil, context: context)
        } dynamicIsland: { context in
            DynamicIsland {
                DynamicIslandExpandedRegion(.leading) {
                    Text("Leading")
                }
                // Other Dynamic Island regions
            } compactLeading: {
                Text("L")
            } compactTrailing: {
                Text("T")
            } minimal: {
                Text("Min")
            }
            .onesignalWidgetURL(URL(string: "myapp://settings"), context: context)
            // Optional: Track Dynamic Island clicks separately
        }
    }
}
```

**Önemli hususlar:**

* Derin bağlantı için bir URL geçirebilir veya yalnızca navigasyon olmadan tıklama izleme istiyorsanız `nil` geçirebilirsiniz
* `.onesignalWidgetURL()` kullanıyorsanız görünüm hiyerarşisi Apple'ın `.widgetURL()` değiştiricisini **içeremez**
* Her ikisindeki tıklamaları izlemek istiyorsanız değiştiriciyi hem ana Live Activity görünümüne hem de Dynamic Island'a uygulayın

### Adım 2: Uygulamanızda URL'leri işleme

Tıklamaları izlemek ve kullanıcıları uygun şekilde yönlendirmek için uygulamanıza URL işleme ekleyin:

```swift theme={null}
import OneSignalLiveActivities

// AppDelegate example:
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    let originalURL = OneSignal.LiveActivities.trackClickAndReturnOriginal(url)

    // Handle the original URL and navigate user
    if let url = originalURL {
        // Your custom URL routing logic
        return handleDeepLink(url)
    }
    return false
}

// SceneDelegate example:
func scene(_ scene: UIScene, openURLContexts URLContexts: Set) {
    guard let url = URLContexts.first?.url else { return }

    let originalURL = OneSignal.LiveActivities.trackClickAndReturnOriginal(url)

    if let url = originalURL {
        // Your custom URL routing logic
        handleDeepLink(url)
    }
}

// SwiftUI example:
.onOpenURL { url in
    let originalURL = OneSignal.LiveActivities.trackClickAndReturnOriginal(url)

    if let url = originalURL {
        // Your custom URL routing logic
        handleDeepLink(url)
    }
}
```

`trackClickAndReturnOriginal()` metodu, OneSignal ile tıklamayı otomatik olarak izler ve uygulamanızın işlemesi için widget'ta belirttiğiniz orijinal URL'yi döndürür.

***

## Bir Live Activity'yi güncelleme

Aktif widget'ları güncellemek için [Update Live Activity API](/reference/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 theme={null}
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"
}'
```

<Frame caption="Live Activity Güncellendi">
  <img src="https://mintcdn.com/onesignal/FXJz6yFfOqztaEND/images/live-activities/live-activity-updated.jpg?fit=max&auto=format&n=FXJz6yFfOqztaEND&q=85&s=729ab3b33c297c15e52617ebd065b293" width="895" height="152" data-path="images/live-activities/live-activity-updated.jpg" />
</Frame>

<Check>
  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](/reference/update-live-activity-api)'ye bakın.
</Check>

***

## Bir Live Activity'yi sonlandırma

Aynı [Update Live Activity API](/reference/update-live-activity-api)'yi kullanarak `"event": "end"` ayarlayarak bir Live Activity'yi sonlandırabiliriz.

```curl curl theme={null}
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](./mobile-sdk-reference#exit) 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.

<Frame caption="Live Activity Sonlandı">
  <img src="https://mintcdn.com/onesignal/FXJz6yFfOqztaEND/images/live-activities/live-activity-ended.jpg?fit=max&auto=format&n=FXJz6yFfOqztaEND&q=85&s=734a62b67cb2fe989203087a22945448" width="1218" height="200" data-path="images/live-activities/live-activity-ended.jpg" />
</Frame>

<Check>
  Live Activity'yi başarıyla sonlandırdınız ve örneği tamamladınız!
</Check>

***

## En iyi uygulamalar ve öneriler

### Tasarım değerlendirmeleri

* Apple'ın [Live Activities İnsan Arayüzü Yönergelerini](https://developer.apple.com/design/human-interface-guidelines/live-activities) 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

* Apple, her [Live Activity sunumunun](https://developer.apple.com/documentation/activitykit/displaying-live-data-with-live-activities#Review-Live-Activity-presentations) desteklenmesini gerektirir.
  * [Compact](https://developer.apple.com/design/human-interface-guidelines/live-activities#Compact-presentation)
  * [Minimal](https://developer.apple.com/design/human-interface-guidelines/live-activities#Minimal-presentation)
  * [Expanded](https://developer.apple.com/design/human-interface-guidelines/live-activities#Expanded-presentation)
  * [Lock Screen](https://developer.apple.com/design/human-interface-guidelines/live-activities#The-Lock-Screen)
* [Derin bağlantılarınızı](https://developer.apple.com/design/human-interface-guidelines/live-activities#Offering-interactivity) test edin.
* Apple'ın [Live Activities ile Canlı Veri Görüntüleme](https://developer.apple.com/documentation/activitykit/displaying-live-data-with-live-activities) kılavuzunu inceleyin.
* Bir Live Activity'de hassas bilgileri görüntülemekten kaçının.

### Yedek mesaj ayarlama

Bir Live Activity başlatıldıktan sonra kullanıcı bir güncelleme alamazsa, uygulamayı açmak aktiviteyi yenilemeli. İlk güncellemeyi göndermeyi beklediğiniz noktadan sonrası için [stale date](/reference/start-live-activity#body-stale-date)'i ileride bir zamana ayarlayın. Güncellemeyi almayan kullanıcılara bunun yerine yedek mesaj gösterilir.

Widget UI'ınızda yedek mesajı göstermek için "stale" durumunu dinleyebilirsiniz:

<Frame caption="Bir Live Activity eski hale geldiğinde gösterilen yedek mesaj.">
  <img src="https://mintcdn.com/onesignal/CKWnlQN-faoVTpm2/images/live-activities/live-activity-refresh.png?fit=max&auto=format&n=CKWnlQN-faoVTpm2&q=85&s=180ef1cc07313ef04361fbd45e2fec24" alt="Yedek mesaj gösteren Live Activity widget'ı" width="509" height="181" data-path="images/live-activities/live-activity-refresh.png" />
</Frame>

```swift theme={null}
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 theme={null}
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:

```swift theme={null}
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](https://onesignal.com/pricing).

### 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](./add-user-data-tags) ve [Segmentler](./segmentation) 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](/reference/start-live-activity) 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](/reference/create-message).

### 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](https://developer.apple.com/documentation/activitykit/starting-and-updating-live-activities-with-activitykit-push-notifications#Determine-the-update-frequency) 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.

<Info>
  Need help?

  Chat with our Support team or email `support@onesignal.com`

  Please 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](/docs/en/capturing-a-debug-log)

  We're happy to help!
</Info>

***
