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

# Platformlar arası Live Activity SDK kurulumu

> OneSignal'in React Native, Flutter, Unity, Cordova ve daha fazlası gibi Wrapper SDK'larında Push To Start ve Varsayılan Live Activity Type desteğiyle Live Activity'leri nasıl uygulayacağınızı öğrenin.

Live Activity'ler nispeten yeni bir iOS özelliğidir ve yerel uygulama gerektirir, bu da React Native, Flutter, Unity, Cordova gibi platformlar arası framework'ler kullanılırken zorluklar yaratabilir. Süreci basitleştirmek için OneSignal'in SDK'sı, yerel kod gereksinimlerini en aza indiren ve desteklenen platformlar arasında kolaylaştırılmış Live Activity entegrasyonunu sağlayan işlevsellik içerir.

## Gereksinimler

* SDK'mızın en son sürümü.
* iOS 16.1+ ve iPadOS 17+
* Bir [.p8 APNs anahtarı](./ios-p8-token-based-connection-to-apns) kullanın. Apple, Live Activity'lerle p12 sertifikalarını desteklemiyor.
* Xcode 14 veya üzeri

## Kurulum

### 1. SDK'mızı kurun

Uygulamanızda Mobile SDK'mızın en son sürümünü kurduğunuzdan emin olun. Live Activity'ler web siteleri için veya Web SDK'mızla kullanılamaz.

<Columns cols={2}>
  <Card href="./unity-sdk-setup">
    <div style={{ display: 'flex', alignItems: 'flex-start', gap: '1rem' }}>
      <div style={{ flexShrink: 0, width: '40px', height: '40px', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
        <img src="https://mintcdn.com/onesignal/4HyuQPBpu-4xjmQC/images/docs/cms/Docs/docs-unity.png?fit=max&auto=format&n=4HyuQPBpu-4xjmQC&q=85&s=4f65e7750194bcbdc08b8f1549d27eb5" style={{ maxWidth: '100%', maxHeight: '100%', objectFit: 'contain' }} width="96" height="96" data-path="images/docs/cms/Docs/docs-unity.png" />
      </div>

      <div>
        <div style={{ fontWeight: '600', fontSize: '1.1rem', marginBottom: '0.25rem' }}>
          Unity
        </div>

        <div>
          Unity tabanlı mobil uygulamalar için platformlar arası SDK rehberi.
        </div>
      </div>
    </div>
  </Card>

  <Card href="./react-native-sdk-setup">
    <div style={{ display: 'flex', alignItems: 'flex-start', gap: '1rem' }}>
      <div style={{ flexShrink: 0, width: '40px', height: '40px', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
        <img src="https://mintcdn.com/onesignal/4HyuQPBpu-4xjmQC/images/docs/cms/Docs/docs-react.png?fit=max&auto=format&n=4HyuQPBpu-4xjmQC&q=85&s=dddbb392fdea1f20e0d9e20e6d90098a" style={{ maxWidth: '100%', maxHeight: '100%', objectFit: 'contain' }} width="96" height="96" data-path="images/docs/cms/Docs/docs-react.png" />
      </div>

      <div>
        <div style={{ fontWeight: '600', fontSize: '1.1rem', marginBottom: '0.25rem' }}>
          React Native & Expo
        </div>

        <div>
          React Native ve Expo ortamları için kurulum talimatları.
        </div>
      </div>
    </div>
  </Card>

  <Card href="./flutter-sdk-setup">
    <div style={{ display: 'flex', alignItems: 'flex-start', gap: '1rem' }}>
      <div style={{ flexShrink: 0, width: '40px', height: '40px', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
        <img src="https://mintcdn.com/onesignal/4HyuQPBpu-4xjmQC/images/docs/cms/Docs/docs-flutter.png?fit=max&auto=format&n=4HyuQPBpu-4xjmQC&q=85&s=09904d15d1b7bd1c5f902a6101c13a22" style={{ maxWidth: '100%', maxHeight: '100%', objectFit: 'contain' }} width="96" height="96" data-path="images/docs/cms/Docs/docs-flutter.png" />
      </div>

      <div>
        <div style={{ fontWeight: '600', fontSize: '1.1rem', marginBottom: '0.25rem' }}>
          Flutter
        </div>

        <div>
          Dart kullanan Flutter uygulamaları için SDK rehberi.
        </div>
      </div>
    </div>
  </Card>

  <Card href="./cordova-sdk-setup">
    <div style={{ display: 'flex', alignItems: 'flex-start', gap: '1rem' }}>
      <div style={{ flexShrink: 0, width: '40px', height: '40px', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
        <img src="https://mintcdn.com/onesignal/4HyuQPBpu-4xjmQC/images/docs/cms/Docs/docs-ionic.png?fit=max&auto=format&n=4HyuQPBpu-4xjmQC&q=85&s=b9e33554d01ff7413f11f9bbf1f4a1b2" style={{ maxWidth: '100%', maxHeight: '100%', objectFit: 'contain' }} width="96" height="96" data-path="images/docs/cms/Docs/docs-ionic.png" />
      </div>

      <div>
        <div style={{ fontWeight: '600', fontSize: '1.1rem', marginBottom: '0.25rem' }}>
          Ionic & Ionic Capacitor
        </div>

        <div>
          Ionic ve Capacitor hibrit mobil uygulamalar için kurulum.
        </div>
      </div>
    </div>
  </Card>

  <Card href="./net-sdk-setup">
    <div style={{ display: 'flex', alignItems: 'flex-start', gap: '1rem' }}>
      <div style={{ flexShrink: 0, width: '40px', height: '40px', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
        <img src="https://mintcdn.com/onesignal/F6GiolM7XhfdYah_/images/docs/cms/Docs/docs-logo-dotnet.svg?fit=max&auto=format&n=F6GiolM7XhfdYah_&q=85&s=89024e079243d091d9bd6fda0493242d" style={{ maxWidth: '100%', maxHeight: '100%', objectFit: 'contain' }} width="48" height="48" data-path="images/docs/cms/Docs/docs-logo-dotnet.svg" />
      </div>

      <div>
        <div style={{ fontWeight: '600', fontSize: '1.1rem', marginBottom: '0.25rem' }}>
          .NET MAUI
        </div>

        <div>
          .NET MAUI uygulamalarıyla entegrasyon için rehber.
        </div>
      </div>
    </div>
  </Card>

  <Card href="./huawei-sdk-setup">
    <div style={{ display: 'flex', alignItems: 'flex-start', gap: '1rem' }}>
      <div style={{ flexShrink: 0, width: '40px', height: '40px', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
        <img src="https://mintcdn.com/onesignal/4HyuQPBpu-4xjmQC/images/docs/cms/Docs/docs-huawei.png?fit=max&auto=format&n=4HyuQPBpu-4xjmQC&q=85&s=d15371678eda8514d135b2d4cc51a56a" style={{ maxWidth: '100%', maxHeight: '100%', objectFit: 'contain' }} width="96" height="96" data-path="images/docs/cms/Docs/docs-huawei.png" />
      </div>

      <div>
        <div style={{ fontWeight: '600', fontSize: '1.1rem', marginBottom: '0.25rem' }}>
          Huawei Android Native
        </div>

        <div>
          HMS push servislerini kullanan Huawei cihazlar için SDK kurulumu.
        </div>
      </div>
    </div>
  </Card>
</Columns>

### 2. Yeni `setupDefault` metodunu ekleyin

OneSignal SDK'sına `DefaultLiveActivityAttributes` türü için LiveActivity yaşam döngüsünü yönetmesini söylemek için `setupDefault` metodunu çağırabilirsiniz. Bu metod, Varsayılan Live Activity'yi başlatmak/güncellemek/sonlandırmak için hem [Start Live Activity](/reference/start-live-activity) hem de [Update Live Activity](/reference/update-live-activity-api) API'lerini kullanmanıza olanak tanır.

<CodeGroup>
  ```javascript React Native/Expo theme={null}
  import { OneSignal } from 'react-native-onesignal'

  //Push To Start
  OneSignal.LiveActivities.setupDefault()

  //Launching the Live Activity from within the app (not needed for push to start)
  const activityId = "my_activity_id"
  const attributes = { title: "Sample Title" } ;
  const content = { message: { en: "message" } };
  OneSignal.LiveActivities.startDefault(activityId, attributes, content);

  ```

  ```csharp Unity theme={null}
  using OneSignalSDK;

  //Push To Start
  OneSignal.LiveActivities.SetupDefault();

  //Launching the Live Activity from within the app (not needed for push to start)
  string activityId = "my_activity_id";

  OneSignal.LiveActivities.StartDefault(
    activityId,
    new Dictionary<string, object>() {
        { "title", "Welcome!" }
    },
    new Dictionary<string, object>() {
        { "message", new Dictionary<string, object>() {
            { "en", "Hello World!"}
        }},
    });
  ```

  ```javascript Cordova/Ionic theme={null}
  /*Cordova*/

  //Push To Start
  window.plugins.OneSignal.LiveActivities.setupDefault();

  //Launching the Live Activity from within the app (not needed for push to start)
  const activityId = "my_activity_id";
  const attributes = { title: "Sample Title" };
  const content = { message: { en: "message" } };
  window.plugins.OneSignal.LiveActivities.startDefault(
    activityId,
    attributes,
    content
  );

  /*Ionic/Capacitor*/
  import OneSignal from "onesignal-cordova-plugin";

  //Push To Start
  OneSignal.LiveActivities.setupDefault();

  //Launching the Live Activity from within the app (not needed for push to start)
  const activityId = "my_activity_id";
  const attributes = { title: "Sample Title" };
  const content = { message: { en: "message" } };
  OneSignal.LiveActivities.startDefault(activityId, attributes, content);
  ```

  ```csharp .NET theme={null}
  using OneSignalSDK;

  //Push To Start
  OneSignal.LiveActivities.SetupDefault();

  //Launching the Live Activity from within the app (not needed for push to start)
  string activityId = "my_activity_id";

  OneSignal.LiveActivities.StartDefault(
    activityId,
    new Dictionary<string, object>() {
        { "title", "Welcome!" }
    },
    new Dictionary<string, object>() {
        { "message", new Dictionary<string, object>() {
            { "en", "Hello World!"}
        }},
    });
  ```

  ```javascript Flutter theme={null}
  import 'package:onesignal_flutter/onesignal_flutter.dart';

  OneSignal.LiveActivities.setupDefault()

  //Launching the Live Activity from within the app (not needed for push to start)
  const String activityId = "my_activity_id";
  OneSignal.LiveActivities.startDefault(activityId!, {
    "title": "Welcome!"
    }, {
    "message": {"en": "Hello World!"},
  });
  ```
</CodeGroup>

### 3. Activity Widget oluşturun

<Steps>
  <Step title="Info.plist dosyanızı güncelleyin">
    Xcode'da ana hedefinizin `Info.plist` dosyasını açın, `Supports Live Activities` anahtarını **Boolean** olarak ekleyin ve değerini `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>

    <Note>
      Live Activity'leri güncellerken, Apple'ın güncellemenin ne kadar acil olduğunu belirlemek için kullandığı bir "öncelik" ayarlama seçeneğiniz vardır. Apple, yüksek öncelik bayrağını çok sık kullanan istekleri kısıtlayacağı dahili eşiklere sahiptir.

      Live Activity'ler için kullanım durumlarınız daha sık yüksek öncelikli güncellemelere dayanıyorsa, [Apple'ın Geliştirici Dokümanlarında](https://developer.apple.com/documentation/activitykit/starting-and-updating-live-activities-with-activitykit-push-notifications#Determine-the-update-frequency) belirtildiği gibi Info.plist dosyanıza `NSSupportsLiveActivitiesFrequentUpdates` anahtarını Boolean türünde YES olarak ayarlayarak ekleyebilirsiniz. Live Activity push bütçesini aştığında kullanıcılara bir diyalog sunulacak ve Live Activity'nin devam etmesine izin verirlerse, bütçe sorunsuz bir kullanıcı deneyimi için otomatik olarak artırılacaktır.
    </Note>
  </Step>

  <Step title="Bir Widget Extension oluşturun">
    Xcode'da **File > New > Target... > Widget Extension** yolunu izleyin.

    <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** düğmesine basın.

    Bir isim vererek Widget Extension'ı yapılandırın (örnek: `OneSignalWidget`) ve **Include Live Activity** seçeneğinin seçildiğinden emin olun. Ardından **Finish** düğmesine 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** düğmesine tıklayın.

    <Frame caption="Bir Live Activity için Widget Extension seçenekleri.">
      <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>
  </Step>

  <Step title="Podfile dosyanıza OneSignalXCFramework ekleyin">
    Projenizin Targets listesinde widget extension hedefinizin adını bulun. Örnekteki ad `OneSignalWidgetExtension`.

    <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` yerine widget extension hedefinizin adını yazın.

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

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

### 4. LiveActivity.swift dosyasını kurun

Xcode'da *WidgetExtensionLiveActivity.swift* dosyasını açın.

Ekranın sağ tarafındaki Inspector panelini açın. **Target Membership** içinde **+** düğmesine tıklayın ve Runner 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>

*WidgetExtensionLiveActivity.swift* dosyasının içeriğini aşağıdaki varsayılan Live Activity düzeniyle güncelleyin. Bu Widget'taki değerler, widget'ta görüntülenmesini istediğiniz herhangi bir şeye değiştirilebilir, setupDefault metodu bu öznitelikler için struct tanımlamayı halledecektir.

```swift Swift theme={null}
import ActivityKit
import WidgetKit
import SwiftUI
import OneSignalLiveActivities

// Your struct name might be different here
@available(iOS 16.2, *)
struct OneSignalWidgetLiveActivity: Widget {
    var body: some WidgetConfiguration {
        ActivityConfiguration(for: DefaultLiveActivityAttributes.self) { context in
            // Lock screen / banner UI
            VStack {
                Spacer()

                Text("Title: " + (context.attributes.data["title"]?.asString() ?? ""))
                    .font(.headline)

                Spacer()

                HStack {
                    Spacer()
                    Text(context.state.data["message"]?.asDict()?["en"]?.asString() ?? "Default Message")
                    Spacer()
                }

                Text("INT: " + String(context.state.data["intValue"]?.asInt() ?? 0))
                Text("DBL: " + String(context.state.data["doubleValue"]?.asDouble() ?? 0.0))
                Text("BOL: " + String(context.state.data["boolValue"]?.asBool() ?? false))

                Spacer()
            }
            .activitySystemActionForegroundColor(.black)
            .activityBackgroundTint(.white)

        } dynamicIsland: { _ in
            DynamicIsland {
                // Expanded UI
                DynamicIslandExpandedRegion(.leading) {
                    Text("Leading")
                }
                DynamicIslandExpandedRegion(.trailing) {
                    Text("Trailing")
                }
                DynamicIslandExpandedRegion(.bottom) {
                    Text("Bottom")
                    // More content
                }
            } compactLeading: {
                Text("L")
            } compactTrailing: {
                Text("T")
            } minimal: {
                Text("Min")
            }
            .widgetURL(URL(string: "http://www.apple.com"))
            .keylineTint(Color.red)
        }
    }
}

```

***

## Live Activity'yi test edin

1. Uygulamayı başlatın

2. [Start Live Activity API referansımızda](/reference/start-live-activity) olası tüm alanları görün. Bu alanların yapısı, UI'nizi nasıl kurduğunuza bağlı olarak farklılık gösterebilir. Örneğin:

* `"event_updates"`: Bu, Live Activity başlatıldıktan sonra güncellenebilecek dinamik veridir (kod örneğindeki `context.state` sonrasındaki her şey). context.state.data olduğundan, bu alana bir data nesnesi ve kod örneğinde eklediğimiz mesaj sözlüğü gibi içindeki ek alanları ekleriz. Kullanım için aşağıdaki örnek isteğe bakın.
* `"event_attributes"`: Bu, push to start isteğinde ayarlanan ve Live Activity kaldırılana veya üzerine yazılana kadar aynı değeri koruyan statik veridir.

3. Push to start kullanırken, `"activity_id"` kodda değil istekte ayarlanır. Farklı Activity ID'leri kullanmak yeni Live Activity'ler başlatacaktır. Aynı Activity ID'yi kullanmak, o ID'yi şu anda kullanan widget'ın üzerine yazacaktır.

4. URL yolunuzda [OneSignal App ID](./keys-and-ids)'yi ve Authorization başlığında [Rest API Key](./keys-and-ids#rest-api-key)'i değiştirdiğinizden emin olun. Varsayılan kurulumu kullanıyorsanız `DefaultActivityAttributes` türü değiştirilemez. Ayrıca lütfen yolunuza eklenen activity türünün büyük/küçük harfe duyarlı olduğunu ve sizin tanımladığınız veya aşağıdaki örnekte kullanılan Varsayılan activity ile eşleşmesi gerektiğini unutmayın.

```curl curl theme={null}
curl --request POST \
     --url https://api.onesignal.com/apps/YOUR_APP_ID/activities/activity/DefaultLiveActivityAttributes \
     --header 'Authorization: key YOUR_REST_API_KEY' \
     --header 'Content-Type: application/json' \
     --header 'accept: application/json' \
     --data '
{
  "event": "start",
  "event_updates": {
    "data": {
      "message": {
        "en": "The message is nested in context.state.data[\"message\"] as a dictionary"
      },
      "intValue": 10,
      "doubleValue": 3.14,
      "boolValue": true
    }
  },
  "event_attributes": {
    "title": "this is set when the LA starts and does not get updated after"
  },
  "activity_id": "my-activity-id",
  "name": "OneSignal Notification Name",
  "contents": {
    "en": "English Message"
  },
  "headings": {
    "en": "English Message"
  },
  "sound": "beep.wav",
  "priority": 10
}'
```

***

## Düşük seviye metodlar

Bunlar, SDK'nın en son sürümünde de eklenmiş olan kendi Push To Start token'ınızı oluşturmak istiyorsanız kullanabileceğiniz isteğe bağlı metodlardır. Bu metodları kullanmak, Xcode ile daha fazla etkileşim kurmanızı ve Swift ile Push To Start için kendi token'ınızı oluşturmanızı gerektirir. Bu konuda bir rehberi [burada](https://github.com/OneSignal/OneSignal-iOS-SDK/pull/1377#:~:text=Alternative%20\(low%20level\)%20method%20to%20setup%20Live%20Activities%20with%20OneSignal) bulabilirsiniz.

<CodeGroup>
  ```javascript React Native/Expo theme={null}
  //Setting the Push To Start Token
  OneSignal.LiveActivities.setPushToStartToken(activityType: string, token: string)

  //Removing the Push To Start Token
  OneSignal.LiveActivities.removePushToStartToken(activityType: string)

  ```

  ```csharp Unity theme={null}
  //Setting the Push To Start Token
  OneSignal.LiveActivities.SetPushToStartToken(string activityType, string token)

  //Removing the Push To Start Token
  OneSignal.LiveActivities.RemovePushToStartToken(string activityType)
  ```

  ```javascript Cordova/Ionic theme={null}
  /* Cordova */
  //Setting the Push To Start Token
  window.plugins.OneSignal.LiveActivities.setPushToStartToken(activityType: string, token: string)

  //Removing the Push To Start Token
  window.plugins.OneSignal.LiveActivities.removePushToStartToken(activityType: string)

  /* Ionic */
  //Setting the Push To Start Token
  OneSignal.LiveActivities.setPushToStartToken(activityType: string, token: string)

  //Removing the Push To Start Token
  OneSignal.LiveActivities.removePushToStartToken(activityType: string)
  ```

  ```csharp .NET theme={null}
  //Setting the Push To Start Token
  OneSignal.LiveActivities.SetPushToStartToken(string activityType, string token)

  //Removing the Push To Start Token
  OneSignal.LiveActivities.RemovePushToStartToken(string activityType)
  ```

  ```javascript Flutter theme={null}
  //Setting the Push To Start Token
  OneSignal.LiveActivities.setPushToStartToken(String activityType, String token)

  //Removing the Push To Start Token
  OneSignal.LiveActivities.removePushToStartToken(String activityType)
  ```
</CodeGroup>

***
