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

# Deep Linking

> Push bildirimleri, e-postalar ve uygulama içi mesajlardan kullanıcıları Android veya iOS uygulamanızdaki belirli ekranlara yönlendirmek için Universal Links, App Links veya özel URI şemaları kullanarak deep linking kurulumu yapın.

## Genel Bakış

Deep linking, bir kullanıcı bir bağlantıya dokunduğunda — e-posta, SMS, web sitesi, push bildirimi veya uygulama içi mesajdan — uygulamanızdaki belirli bir ekrana yönlendirir. Uygulama yüklü değilse, işletim sistemi kullanıcıları uygulama mağazasına veya yedek bir web sayfasına yönlendirebilir.

Bu kılavuz şunları kapsar:

* **Deep link türleri** ve her birinin ne zaman kullanılacağı
* Android ve iOS için **platform kurulumu**
* OneSignal SDK ile uygulamanızda **deep link'lerin işlenmesi**
* Push, e-posta ve uygulama içi mesajlar için **kanala özgü davranış**

<Info>
  Genel URL ve bağlantı yapılandırması (Launch URL'ler, UTM parametreleri, dinamik URL'ler, bağlantı takibi) için bkz. [URL'ler, bağlantılar ve deep link'ler](./links).
</Info>

***

## Ön Koşullar

Deep link'leri kurmadan önce şunlara ihtiyacınız vardır:

* Yapılandırılmış bir uygulamayla birlikte bir [OneSignal hesabı](https://dashboard.onesignal.com)
* Mobil uygulamanızda yüklü [OneSignal SDK](./mobile-sdk-setup)
* Universal Links veya App Links için **HTTPS** üzerinden barındırılan, kontrolünüzdeki bir alan adı
* Uygulamanızın kaynak koduna ve derleme yapılandırmasına erişim (iOS için Xcode, Android için Android Studio)

***

## Deep link türleri

Üç yaygın deep linking mekanizması vardır. Her biri, uygulamanın yüklü olup olmadığına bağlı olarak farklı davranış gösterir.

| Tür                   | Platform       | Format                        | Uygulama yüklü değilse                     |
| --------------------- | -------------- | ----------------------------- | ------------------------------------------ |
| **Universal Links**   | iOS 9+         | `https://yourdomain.com/path` | URL'yi Safari'de açar                      |
| **App Links**         | Android 6.0+   | `https://yourdomain.com/path` | URL'yi tarayıcıda açar                     |
| **Özel URI şemaları** | iOS ve Android | `myapp://path`                | Sessizce başarısız olur veya hata gösterir |

**Öneri:** En güvenilir deneyim için Universal Links (iOS) ve App Links (Android) kullanın. Bunlar standart `https://` URL'leri kullanır, kanallar arası (push, e-posta, SMS) çalışır ve uygulama yüklü olmadığında yedek davranış sağlar. Özel URI şemaları (`myapp://`) kurulumu daha basittir, ancak yedek davranış sağlamaz ve tüm bağlamlarda çalışmayabilir (örneğin, e-posta istemcileri).

<Warning>
  Universal Links ve App Links, alan adınızda bir doğrulama dosyasının barındırılmasını gerektirir. Bu dosya olmadan, işletim sistemi bağlantıyı normal bir web URL'si olarak ele alır.
</Warning>

***

## Android kurulumu (App Links)

Gerekli yapılandırmayı oluşturmak için Android Studio'nun [App Links Assistant](https://developer.android.com/training/app-links)'ını kullanın.

### Intent filtrelerini yapılandırma

Deep link'i işleyecek Activity'ye bir intent filtresi ekleyin:

```xml theme={null}
<activity android:name=".DeepLinkActivity" android:exported="true">
  <intent-filter android:autoVerify="true">
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="https" android:host="yourdomain.com" />
  </intent-filter>
</activity>
```

### Gelen intent'i işleme

```java theme={null}
Intent appLinkIntent = getIntent();
String appLinkAction = appLinkIntent.getAction();
Uri appLinkData = appLinkIntent.getData();
```

### Digital Asset Links dosyasını barındırma

`assetlinks.json` dosyasını Android Studio'nun App Links Assistant'ını kullanarak oluşturun ve şu adreste barındırın:

```
https://yourdomain.com/.well-known/assetlinks.json
```

Tam dosya formatı ve doğrulama adımları için Google'ın [Verify App Links](https://developer.android.com/training/app-links/verify-android-applinks) belgelerine bakın.

***

## iOS kurulumu (Universal Links)

Apple [Universal Links](https://developer.apple.com/documentation/xcode/supporting-universal-links-in-your-app), kullanıcı eşleşen bir `https://` URL'sine dokunduğunda uygulamanızı açar. Uygulamanın yüklü olduğunun garantili olduğu daha basit kullanım durumları için bunun yerine [URL Schemes](https://developer.apple.com/documentation/xcode/defining-a-custom-url-scheme-for-your-app) kullanabilirsiniz.

### Associated Domains'i etkinleştirme

1. Xcode'da hedefi seçin → **Signing & Capabilities** → **Associated Domains** ekleyin
2. Alan adınızı ekleyin: `applinks:yourdomain.com`

### Uygulamanızda Universal Link'i işleme

<CodeGroup>
  ```swift Swift theme={null}
  func application(_ application: UIApplication,
                   continue userActivity: NSUserActivity,
                   restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
          let url = userActivity.webpageURL else {
      return false
    }
    // Route to the correct screen based on the URL path
    return true
  }
  ```

  ```objectivec Objective-C theme={null}
  - (BOOL)application:(UIApplication *)application
      continueUserActivity:(NSUserActivity *)userActivity
      restorationHandler:(void (^)(NSArray *))restorationHandler {
    if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
      NSURL *url = userActivity.webpageURL;
      // Route to the correct screen based on the URL path
      return YES;
    }
    return NO;
  }
  ```
</CodeGroup>

### Apple App Site Association dosyasını barındırma

Bir `apple-app-site-association` (AASA) dosyası oluşturun ve şu adreste barındırın:

```
https://yourdomain.com/.well-known/apple-app-site-association
```

`TEAMID` yerine Apple Team ID'nizi, `com.example.app` yerine bundle identifier'ınızı yazın:

```json theme={null}
{
  "applinks": {
    "apps": [],
    "details": [{
      "appID": "TEAMID.com.example.app",
      "paths": ["/path/*", "/another-path"]
    }]
  }
}
```

Tam spesifikasyon için Apple'ın [Supporting Associated Domains](https://developer.apple.com/documentation/xcode/supporting-associated-domains) belgelerine bakın.

### iOS Launch URL davranışı

OneSignal'ın iOS SDK'sı, Launch URL'yi (`url` özelliği) işlemek için `openURL` kullanır. Bu, bağlantının önce tarayıcıda açılmasına, ardından uygulamaya geri yönlendirilmesine neden olur — bu kullanıcı deneyimi açısından kötü olabilir.

Bunu önlemek için şu yaklaşımlardan birini kullanın:

1. API yükünde `url` yerine **`data` kullanın** ve deep link'i [Push Bildirimi Tıklama Dinleyicisi](./mobile-sdk-reference#addclicklistener-push)'nde işleyin
2. `Info.plist`'e `OneSignal_suppress_launch_urls`'i Boolean olarak `YES` değeriyle ekleyerek **Launch URL'leri bastırın**, ardından tüm gezinmeyi tıklama dinleyicisinde işleyin

<Tip>
  İşletim sisteminin URL'yi çözmesine güvenmeden gezinme üzerinde tam kontrol sağladığı için 1. yaklaşım (`data` + tıklama dinleyicisi kullanımı) önerilir.
</Tip>

***

## Deep link'leri OneSignal SDK ile işleme

OneSignal mesajlarından deep link'leri işlemenin en güvenilir yolu, işletim sistemi düzeyinde bağlantı çözümüne güvenmek yerine SDK'nın tıklama dinleyicilerini kullanmaktır. Bu, uygulamanızdaki gezinme üzerinde tam kontrol sağlar.

### Push bildirimi tıklama dinleyicisi

Bildirim tıklamalarını yakalamak ve kullanıcıyı deep link URL'si veya ek verilere göre yönlendirmek için `addClickListener` kullanın:

<CodeGroup>
  ```kotlin Kotlin theme={null}
  OneSignal.Notifications.addClickListener { event ->
    val url = event.notification.launchURL
    val data = event.notification.additionalData
    // Route to the correct screen based on url or data
  }
  ```

  ```swift Swift theme={null}
  class AppDelegate: UIResponder, UIApplicationDelegate, OSNotificationClickListener {
    func application(_ application: UIApplication,
                     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
      OneSignal.Notifications.addClickListener(self)
      return true
    }

    func onClick(event: OSNotificationClickEvent) {
      let url = event.notification.launchURL
      let data = event.notification.additionalData
      // Route to the correct screen based on url or data
    }
  }
  ```

  ```javascript React Native theme={null}
  OneSignal.Notifications.addEventListener('click', (event) => {
    const url = event.notification.launchURL;
    const data = event.notification.additionalData;
    // Route to the correct screen based on url or data
  });
  ```

  ```dart Flutter theme={null}
  OneSignal.Notifications.addClickListener((event) {
    final url = event.notification.launchUrl;
    final data = event.notification.additionalData;
    // Route to the correct screen based on url or data
  });
  ```

  ```csharp Unity (C#) theme={null}
  OneSignal.Notifications.Clicked += (sender, e) => {
    var url = e.Notification.LaunchURL;
    var data = e.Notification.AdditionalData;
    // Route to the correct screen based on url or data
  };
  ```
</CodeGroup>

Java, Objective-C ve Cordova/Ionic dahil tam API referansı için bkz. [`addClickListener()` Push](./mobile-sdk-reference#addclicklistener-push).

### Uygulama içi mesaj tıklama dinleyicisi

Uygulama içi mesaj butonlarından ve eylemlerinden deep link'leri işlemek için uygulama içi mesaj tıklama dinleyicisini kullanın:

<CodeGroup>
  ```kotlin Kotlin theme={null}
  OneSignal.InAppMessages.addClickListener { event ->
    val actionId = event.result.actionId
    // Route based on the action ID (your deep link URI)
  }
  ```

  ```swift Swift theme={null}
  func onClick(event: OSInAppMessageClickEvent) {
    let actionId = event.result.actionId
    // Route based on the action ID (your deep link URI)
  }
  ```

  ```javascript React Native theme={null}
  OneSignal.InAppMessages.addEventListener('click', (event) => {
    const actionId = event.result.actionId;
    // Route based on the action ID (your deep link URI)
  });
  ```

  ```dart Flutter theme={null}
  OneSignal.InAppMessages.addClickListener((event) {
    final actionId = event.result.actionId;
    // Route based on the action ID (your deep link URI)
  });
  ```
</CodeGroup>

Tam API referansı için bkz. [`addClickListener()` In-App](./mobile-sdk-reference#addclicklistener-in-app).

***

## Push bildirimleri

Deep link'i iki yoldan biriyle ekleyin:

| Yöntem                 | API özelliği                               | Davranış                                                                                  |
| ---------------------- | ------------------------------------------ | ----------------------------------------------------------------------------------------- |
| **Launch URL**         | `url` (veya yalnızca mobil için `app_url`) | İşletim sistemi URL'yi doğrudan açar. iOS'ta, bastırılmadığı sürece önce tarayıcıyı açar. |
| **Ek Veri** (önerilen) | `data`                                     | URL tıklama dinleyicinize iletilir. Gezinmeyi tamamen siz kontrol edersiniz.              |

### Platform davranışı

* **Android**: App Links aracılığıyla eşleşen Activity'yi doğrudan açar
* **iOS**: Safari'yi açar, ardından uygulamayı açar ([Launch URL'leri bastırıp](#ios-launch-url-davranışı) tıklama dinleyicisinde gezinmeyi işlemediğiniz sürece)

`url`, `web_url` ve `app_url` hedefleme hakkında ayrıntılar için bkz. [URL'ler, bağlantılar ve deep link'ler](./links).

***

## E-postalar

Varsayılan olarak, OneSignal tıklama takibi için e-posta bağlantılarını yeniden yazar. Bu, URL'yi değiştirir ve işletim sistemi artık alan adını uygulamanızın İlişkili Alan Adı ile eşleşen bir alan olarak tanımadığından deep linking'i bozar.

### E-postada deep link'leri etkinleştirme

Deep link'leri korumak için şu yöntemlerden birini kullanarak tıklama takibini devre dışı bırakın:

* **Dashboard**: E-posta editöründe **Track link clicks** seçeneğinin işaretini kaldırın
* **API**: `disable_email_click_tracking: true` ayarlayın
* **Bağlantı başına**: Diğerleri için etkin tutarken tek tek bağlantılarda takibi devre dışı bırakmak için çapa etiketine `disable-tracking=true` özniteliğini ekleyin (`<a href="https://yourdomain.com/path" disable-tracking=true>…</a>`)

<Frame caption="E-posta editöründe Track link clicks devre dışı bırakıldı.">
  <img src="https://mintcdn.com/onesignal/jBdBk5XvQR5eKOks/images/docs/787e21d-Screenshot_2024-05-29_at_2.21.43_PM.png?fit=max&auto=format&n=jBdBk5XvQR5eKOks&q=85&s=f7e1079f4860ecf34fd95375a4332573" alt="Track link clicks onay kutusu işaretlenmemiş OneSignal e-posta editörü" width="1756" height="492" data-path="images/docs/787e21d-Screenshot_2024-05-29_at_2.21.43_PM.png" />
</Frame>

<Warning>
  Tıklama takibini devre dışı bırakmak, [E-posta Raporları](./email-message-reports)'ndaki tıklama metriklerini kaybetmenize neden olur. Deep link içermeyen URL'lerde analitiği korumak için bağlantı başına takip dışlaması kullanmayı değerlendirin.
</Warning>

### E-posta deep link davranışı

| Senaryo                                               | Sonuç                                   |
| ----------------------------------------------------- | --------------------------------------- |
| iOS + Safari + Universal Link + Takip devre dışı      | Uygulamayı doğrudan açar                |
| iOS + Safari + Universal Link + Takip etkin           | Safari'yi açar, uygulamayı açmayı sorar |
| iOS + Safari olmayan posta istemcisi + Universal Link | Uygulama yüklü değilse App Store'u açar |
| Android + App Link + Takip devre dışı                 | Uygulamayı doğrudan açar                |
| Android + App Link + Takip etkin                      | Önce tarayıcıyı, sonra uygulamayı açar  |

***

## Uygulama içi mesajlar

Uygulama içi mesajlardaki deep link'ler tıklama dinleyicisi desenini kullanır. Mesaj editöründe özel bir eylem tanımlayıcısı belirler, ardından uygulama kodunuzda işlersiniz.

### Sürükle ve bırak editörü

1. Bir buton veya tıklanabilir öğe ekleyin
2. Tıklama eylemini [Custom Action ID](./iam-click-actions#custom-action-id) olarak ayarlayın
3. Deep link URI'nizi **Action Name** olarak girin (örneğin, `https://yourdomain.com/promo` veya `myapp://promo`)

### HTML editörü

Özel HTML'den deep link'leri tetiklemek için Uygulama İçi JS Kütüphanesi'ndeki [`openUrl`](./in-app-message-api#click-name) yöntemini kullanın.

### Tıklamayı işleme

Eylemi yakalamak ve kullanıcıyı uygulamanızda yönlendirmek için [uygulama içi mesaj tıklama dinleyicisini](#uygulama-içi-mesaj-tıklama-dinleyicisi) kullanın.

***

## Deep link'leri test etme

### Android

Bildirim göndermeden App Links'i test etmek için `adb` kullanın:

```bash theme={null}
adb shell am start -a android.intent.action.VIEW \
  -d "https://yourdomain.com/path" \
  com.your.package
```

`assetlinks.json` dosyanızın erişilebilir olduğunu doğrulayın:

```bash theme={null}
curl -I https://yourdomain.com/.well-known/assetlinks.json
```

### iOS

AASA dosyanızı doğrulamak için Apple'ın [İlişkili Alan Adları doğrulama aracını](https://search.developer.apple.com/appsearch-validation-tool/) kullanın. Universal Link'leri aşağıdaki adımlarla da test edebilirsiniz:

1. Bağlantıyı Notes uygulamasına yapıştırın
2. "Uygulamada Aç" seçeneğinin göründüğünü onaylamak için bağlantıya uzun basın
3. Uygulamanızın açıldığını doğrulamak için bağlantıya dokunun

<Note>
  Universal Links, doğrudan Safari adres çubuğuna yazıldığında çalışmaz — başka bir uygulamadan (Notes, Mail, Messages vb.) dokunulması gerekir.
</Note>

### OneSignal test mesajları

1. OneSignal dashboard'dan Launch URL olarak veya Ek Veri içinde bir deep link URL'si ile test push'u gönderin
2. Bildirimin uygulamanızdaki doğru ekranı açtığını doğrulayın
3. URL veya verinin alındığını onaylamak için tıklama dinleyici günlüklerinizi kontrol edin

***

## Sorun Giderme

### iOS deep link'i uygulama yerine Safari'yi açıyor

Bu en yaygın sorundur. Olası nedenler:

* **AASA dosyası doğru barındırılmamış** — `https://yourdomain.com/.well-known/apple-app-site-association` adresinde `Content-Type: application/json` ile ve yönlendirme olmadan erişilebilir olduğunu doğrulayın
* **Associated Domains yapılandırılmamış** — Xcode → Signing & Capabilities → Associated Domains'in `applinks:yourdomain.com` içerip içermediğini kontrol edin
* **Launch URL davranışı** — OneSignal'ın iOS SDK'sı `url` özelliği için `openURL` kullanır, bu da tarayıcı öncelikli davranışı tetikler. Bunun yerine `data` + tıklama dinleyicisi kullanın veya [Launch URL'leri bastırın](#ios-launch-url-davranışı)
* **Safari'de test etme** — Universal Links, Safari adres çubuğundan etkinleşmez. Notes, Mail veya başka bir uygulamadan test edin.

### Android deep link'i tarayıcıyı açıyor

* **`autoVerify` eksik** — Intent filtrenizin `android:autoVerify="true"` içerdiğinden emin olun
* **`assetlinks.json` bulunamıyor** — Dosyanın `https://yourdomain.com/.well-known/assetlinks.json` adresinde olduğunu ve HTTP 200 döndürdüğünü doğrulayın
* **SHA256 parmak izi uyuşmazlığı** — `assetlinks.json` içindeki parmak izi, uygulamanızın imzalama sertifikasıyla eşleşmelidir. Hata ayıklama ve sürüm derlemeleri farklı sertifikalar kullanır.

### Deep link push'ta çalışıyor ama e-postada çalışmıyor

E-posta tıklama takibi URL'leri yeniden yazar ve alan adı doğrulamasını bozar. Deep link içeren e-postalar için [tıklama takibini devre dışı bırakın](#e-postada-deep-linkleri-etkinleştirme).

### Deep link alındı ama uygulama yönlendirmiyor

* Tıklama dinleyicinizin uygulama yaşam döngüsünün başında kayıtlı olduğunu doğrulayın (örneğin, `Application.onCreate()` veya `AppDelegate.didFinishLaunchingWithOptions` içinde)
* URL veya eylem kimliğinin yönlendirme mantığınızın beklediğiyle eşleştiğini kontrol edin
* iOS'ta, Launch URL'leri bastırmadan `url`'ye güvenmediğinizi onaylayın — tarayıcı, dinleyiciniz tetiklenmeden önce bağlantıyı tüketebilir

***

## SSS

### Uygulama yüklü değilse ne olur?

Universal Links (iOS) ile URL, normal bir web sayfası olarak Safari'de açılır. App Links (Android) ile URL, varsayılan tarayıcıda açılır. Her iki durumda da, web sayfanızı uygun uygulama mağazasına yönlendirecek şekilde yapılandırabilirsiniz. Özel URI şemaları (`myapp://`), uygulama yüklü değilse sessizce başarısız olur veya hata gösterir.

### Deep linking için Launch URL mi yoksa Ek Veri mi kullanmalıyım?

Ek Veri (`data`), tıklama dinleyicisi aracılığıyla gezinme üzerinde tam kontrol sağladığı için mobil deep link'ler için önerilir. Launch URL (`url`) daha basittir ancak iOS'ta sınırlamaları vardır (tarayıcı yönlendirmesi) ve özel yönlendirme mantığına izin vermez.

### Deep link'leri kullanıcı verileriyle kişiselleştirebilir miyim?

Evet. Deep link URL'lerinize kullanıcı özellikleri, etiketler veya özel veriler eklemek için Liquid söz dizimiyle [Dinamik URL'leri](./links#dynamic-urls) kullanın. Örneğin: `https://yourdomain.com/profile/{{subscription.external_id}}`.

### Özel URI şemalarıyla deep link kullanabilir miyim?

Evet. Özel şemanızı (örneğin, `myapp://screen`) Launch URL veya Ek Veri değeri olarak ayarlayın. Özel şemalar push ve uygulama içi mesajlar için iyi çalışır ancak e-posta istemcilerinde çalışmayabilir. Ayrıca uygulama yüklü değilse yedek davranış sağlamaz.

### Deep link'ler OneSignal Journeys ile çalışır mı?

Evet. Bir Journey'de bir mesaj adımı yapılandırırken, Launch URL'yi veya Ek Veriyi deep link'inize ayarlayın. Davranış, bağımsız bir push veya uygulama içi mesajla aynıdır.

***

<Columns cols={2}>
  <Card title="URL'ler, bağlantılar ve deep link'ler" icon="link" href="./links">
    Launch URL'ler, UTM parametreleri, dinamik URL'ler ve bağlantı takibi yapılandırması.
  </Card>

  <Card title="Mobil SDK referansı" icon="code" href="./mobile-sdk-reference">
    Tıklama dinleyicileri ve bildirim olay işleme için tam API referansı.
  </Card>

  <Card title="Uygulama İçi Tıklama Eylemleri" icon="hand-pointer" href="./iam-click-actions">
    Uygulama içi mesaj butonları ve öğeleri için tıklama eylemlerini yapılandırın.
  </Card>

  <Card title="Mobil push kurulumu" icon="mobile" href="./mobile-push-setup">
    Android ve iOS için platforma özgü push bildirimi kurulumu.
  </Card>
</Columns>
