---
title: "Paywall zamanlayıcısı"
description: "Dönüşümleri artırmak ve aciliyet hissi yaratmak için Adapty'nin paywall zamanlayıcısı özelliğini kullanın."
---

Paywall zamanlayıcısı, süreli özel ve sezonluk teklifleri tanıtmak için harika bir araçtır. Ancak şunu belirtmek gerekir: bu zamanlayıcı, teklifin geçerlilik süresiyle veya kampanyanın bitiş tarihiyle bağlantılı değildir. Yalnızca belirlediğiniz değerden sıfıra doğru geri sayan bağımsız bir geri sayım sayacıdır. Sayaç sıfıra ulaştığında hiçbir şey olmaz—sadece sıfırda kalır.

  <img src="/assets/shared/img/87de83a-Timer_withou_text.webp"
  style={{
    border: 'none', /* border width and color */
    width: '200px', /* image width */
    display: 'block', /* for alignment */
    margin: '0 auto' /* center alignment */
  }}
/>

:::warning

Paywall zamanlayıcıları yalnızca iOS, Android ve React Native SDK'ların 3.0 veya üzeri sürümleriyle, Flutter ve Unity SDK'larının ise 3.3.0 veya üzeri sürümleriyle çalışan [yeni Paywall Builder](adapty-paywall-builder)'da mevcuttur. Adapty SDK v2.x veya daha eski sürümlerle çalışan eski Paywall Builder, paywall zamanlayıcısı işlevselliğini desteklememektedir.

:::

İstediğiniz mesajı oluşturmak için zamanlayıcının öncesine ve sonrasına metin ekleyebilirsiniz; örneğin: "Teklif bitiyor: 10:00 sn."

  <img src="/assets/shared/img/f1be626-timer_example.webp"
  style={{
    border: 'none', /* border width and color */
    width: '200px', /* image width */
    display: 'block', /* for alignment */
    margin: '0 auto' /* center alignment */
  }}
/>

1. Bir paywall'a veya kart gibi başka bir paywall öğesine ayrı bir öğe olarak zamanlayıcı ekleyin.

2. Zamanlayıcının ayarlarını yapılandırın: format ve ayırıcı, başlangıç değeri, öncesine ve sonrasına eklenecek metin (gerekirse), renk, yazı tipi, boşluk vb.

  <img src="/assets/shared/img/e83e891-timer.webp"
  style={{
    border: '1px solid #727272', /* border width and color */
    width: '700px', /* image width */
    display: 'block', /* for alignment */
    margin: '0 auto' /* center alignment */
  }}
/>

## Zamanlayıcı modu \{#timer-mode\}

**Timer mode** parametresini kullanarak zamanlayıcının kullanıcılara göründüğünde nasıl davranacağını kontrol edebilirsiniz. Hazır olarak çalışan 3 standart mod bulunmaktadır—açılır listeden istediğiniz seçeneği seçmeniz yeterlidir:

| Mod | Açıklama |
| ------------------------------------- | ------------------------------------------------------------ |
| **Reset timer on every paywall view** | Kullanıcı her paywall gördüğünde zamanlayıcı sıfırlanır ve her seferinde başlangıç değerinden başlar. |
| **Reset timer on every app launch**   | Zamanlayıcı, kullanıcının paywallı ilk gördüğü anda başlar ve uygulama yeniden başlatılana kadar ön planda veya arka planda saymaya devam eder. Kullanıcı aynı oturumda paywallı birden fazla kez görürse aynı geri sayımı görür. Uygulama kapatılınca zamanlayıcı sıfırlanır ve uygulama bir sonraki açılışında baştan başlar. |
| **Keep timer across app launches**    | Zamanlayıcı, kullanıcının paywallı ilk gördüğü anda başlar ve uygulama kapatılsa bile ön planda veya arka planda saymaya devam eder. Kullanıcı, uygulama veya paywall yeniden başlatılsa da paywalla her döndüğünde aynı zamanlayıcıyı görür. |
| **Developer defined**                 | Mobil uygulama kodunuzda dilediğiniz zamanlayıcıyı kurabilirsiniz. Önce bir **Timer ID** girin, ardından zamanlayıcıyı istediğiniz şekilde yapılandırmak için [Mobil uygulamanızda geliştirici tanımlı zamanlayıcıları nasıl kurarsınız?](paywall-timer#how-to-set-up-developer-defined-timers-in-your-mobile-app) bölümünde açıklandığı gibi kodunuzda kullanın. |

## Zamanlayıcı bittiğinde ne olur? \{#what-happens-when-the-timer-ends\}

Zamanlayıcı sona erdiğinde ne olacağını özelleştirebilirsiniz. Yeni bir fırsatla başka bir ekran mı gösterilsin? Yoksa farklı bir paywall mı açılsın? Biraz kod yazmanız gerekiyor, ancak belgelerimizle bunu kolayca halledebilirsiniz.

1. **Trigger custom action when the timer runs out** geçiş düğmesini açın.

   
     <img src="/assets/shared/img/timer-action-on.webp"
     style={{
       border: '1px solid #727272', /* border width and color */
       width: '700px', /* image width */
       display: 'block', /* for alignment */
       margin: '0 auto' /* center alignment */
     }}
   />
   

2. **Timer action ID** alanına tetiklemek istediğiniz eylemin ID'sini girin.

   
     <img src="/assets/shared/img/timer-action-id.webp"
     style={{
       border: '1px solid #727272', /* border width and color */
       width: '700px', /* image width */
       display: 'block', /* for alignment */
       margin: '0 auto' /* center alignment */
     }}
   />
   
   
3. Zamanlayıcı sona erdiğinde ne olması gerektiğini tanımlamak için bu eylem ID'sini uygulamanızda kullanın. Bunu, [iOS](ios-handling-events#user-generated-events) ve [Android](android-handling-events#user-generated-events) için **Olayları İşleme: Eylemler** kılavuzumuzda açıklandığı gibi, diğer özel eylemlerle aynı şekilde ele alın.

## Mobil uygulamanızda geliştirici tanımlı zamanlayıcıları nasıl kurarsınız? \{#how-to-set-up-developer-defined-timers-in-your-mobile-app\}

Mobil uygulamanızda özel zamanlayıcılar kullanmak için `AdaptyTimerResolver` protokolüne uyan bir nesne oluşturun. Bu nesne, her özel zamanlayıcının nasıl görüntüleneceğini tanımlar. Tercih ederseniz, bu protokole zaten uygun olan bir `[String: Date]` sözlüğünü doğrudan kullanabilirsiniz. İşte bir örnek:

<Tabs groupId="current-os" queryString> <TabItem value="swift" label="Swift" default>

```Swift showLineNumbers
@MainActor
struct AdaptyTimerResolverImpl: AdaptyTimerResolver {
    func timerEndAtDate(for timerId: String) -> Date {
        switch timerId {
        case "CUSTOM_TIMER_6H":
            Date(timeIntervalSinceNow: 3600.0 * 6.0) // 6 hours
        case "CUSTOM_TIMER_NY":
            Calendar.current.date(from: DateComponents(year: 2025, month: 1, day: 1)) ?? Date(timeIntervalSinceNow: 3600.0)
        default:
            Date(timeIntervalSinceNow: 3600.0) // 1 hour
        }
    }
}
```

Bu örnekte `CUSTOM_TIMER_NY` ve `CUSTOM_TIMER_6H`, Adapty Kontrol Paneli'nde belirlediğiniz geliştirici tanımlı zamanlayıcıların **Timer ID**'leridir. `timerResolver`, uygulamanızın her zamanlayıcıyı doğru değerle dinamik olarak güncellemesini sağlar. Örneğin:

- `CUSTOM_TIMER_NY`: Yılbaşı gibi zamanlayıcının bitiş anına kadar kalan süre.
- `CUSTOM_TIMER_6H`: Kullanıcının paywallı açtığı andan itibaren başlayan 6 saatlik sürede kalan zaman.

</TabItem> <TabItem value="kotlin" label="Kotlin" default> 

```kotlin showLineNumbers

...

val customTimers = mapOf(
    "CUSTOM_TIMER_NY" to Calendar.getInstance(TimeZone.getDefault()).apply { set(2025, 0, 1) }.time, // New Year 2025
)
val timerResolver = AdaptyUiTimerResolver { timerId ->
    customTimers.getOrElse(timerId, { Date(System.currentTimeMillis() + 3600 * 1000L) /* in 1 hour */ } )
}
```

Bu örnekte `CUSTOM_TIMER_NY`, Adapty kontrol panelinde belirlediğiniz geliştirici tanımlı zamanlayıcının **Timer ID**'sidir. `timerResolver`, uygulamanızın zamanlayıcıyı doğru değerle (örneğin, Yılbaşı gibi bitiş zamanından mevcut zaman çıkarılarak hesaplanan `13d 09h 03m 34s`) dinamik olarak güncellemesini sağlar.

</TabItem> <TabItem value="java" label="Java" default> 

```JAVA showLineNumbers

...

Map<String, Date> customTimers = new HashMap<>();
customTimers.put(
        "CUSTOM_TIMER_NY",
        new Calendar.Builder().setTimeZone(TimeZone.getDefault()).setDate(2025, 0, 1).build().getTime()
);
AdaptyUiTimerResolver timerResolver = new AdaptyUiTimerResolver() {
    @NonNull
    @Override
    public Date timerEndAtDate(@NonNull String timerId) {
        Date date = customTimers.get(timerId);
        return date != null ? date : new Date(System.currentTimeMillis() + 3600 * 1000L); /* in 1 hour */
    }
};
```

Bu örnekte `CUSTOM_TIMER_NY`, Adapty kontrol panelinde belirlediğiniz geliştirici tanımlı zamanlayıcının **Timer ID**'sidir. `timerResolver`, uygulamanızın zamanlayıcıyı doğru değerle (örneğin, Yılbaşı gibi bitiş zamanından mevcut zaman çıkarılarak hesaplanan `13d 09h 03m 34s`) dinamik olarak güncellemesini sağlar.

</TabItem> <TabItem value="flutter" label="Flutter" default> 

```dart showLineNumbers
try {
      final view = await AdaptyUI().createPaywallView(
        paywall: paywall,
        customTags: ...,
        customTimers: {
          'CUSTOM_TIMER_6H': DateTime.now().add(const Duration(seconds: 3600 * 6)),
          'CUSTOM_TIMER_NY': DateTime(2025, 1, 1), // New Year 2025
        },
        preloadProducts: ...,
      );
    } on AdaptyError catch (e) {
      // handle the error
    } catch (e) {
      // handle the error
    }
```

Bu örnekte `CUSTOM_TIMER_NY` ve `CUSTOM_TIMER_6H`, Adapty Kontrol Paneli'nde belirlediğiniz geliştirici tanımlı zamanlayıcıların **Timer ID**'leridir. `timerResolver`, uygulamanızın her zamanlayıcıyı doğru değerle dinamik olarak güncellemesini sağlar. Örneğin:

- `CUSTOM_TIMER_NY`: Yılbaşı gibi zamanlayıcının bitiş anına kadar kalan süre.
- `CUSTOM_TIMER_6H`: Kullanıcının paywallı açtığı andan itibaren başlayan 6 saatlik sürede kalan zaman.

</TabItem> 

<TabItem value="unity" label="Unity (C#)" default> 

```csharp showLineNumbers
var parameters = new AdaptyUICreateViewParameters()
  .SetCustomTimers(
    new Dictionary<string, DateTime> {
      { "CUSTOM_TIMER_6H", DateTime.Now.AddHours(6) }, // 6 hours
      { "CUSTOM_TIMER_NY", new DateTime(2025, 1, 1) } // New Year 2025
    }
  )

AdaptyUI.CreateView(paywall, parameters, (view, error) => {
  // handle the result
});
```

- Bu örnekte `CUSTOM_TIMER_NY` ve `CUSTOM_TIMER_6H`, Adapty Kontrol Paneli'nde belirlediğiniz geliştirici tanımlı zamanlayıcıların **Timer ID**'leridir. `timerResolver`, uygulamanızın her zamanlayıcıyı doğru değerle dinamik olarak güncellemesini sağlar. Örneğin:

  - `CUSTOM_TIMER_NY`: Yılbaşı gibi zamanlayıcının bitiş anına kadar kalan süre.
  - `CUSTOM_TIMER_6H`: Kullanıcının paywallı açtığı andan itibaren başlayan 6 saatlik sürede kalan zaman.

</TabItem> 

 <TabItem value="rn" label="React Native (TS)" default> 

```typescript showLineNumbers
let customTimers = { 'CUSTOM_TIMER_NY': new Date(2025, 0, 1) }
//and then you can pass it to createPaywallView as follows:
view = await createPaywallView(paywall, { customTimers })
```

Bu örnekte `CUSTOM_TIMER_NY`, Adapty kontrol panelinde belirlediğiniz geliştirici tanımlı zamanlayıcının **Timer ID**'sidir. `timerResolver`, uygulamanızın zamanlayıcıyı doğru değerle (örneğin, Yılbaşı gibi bitiş zamanından mevcut zaman çıkarılarak hesaplanan `13d 09h 03m 34s`) dinamik olarak güncellemesini sağlar.

 </TabItem> 
 </Tabs>