Android SDK'da flow ve paywall çekme işlemini optimize etme

Android’de güvenilir bir flow veya paywall çekme işlemi üç şeyi sağlar: hızlı render, kitleye özel varyantı döndürme ve ağ yavaş olduğunda sorunsuz yedeklemeye geçme. Aşağıdaki kurallar, bunu başarmak için gereken zamanlama, önbellekleme ve yedek desenleri kapsar.

Tip

Bu kurallar, Adapty.activate() ve Adapty.identify() işlevlerinin zaten tamamlandığını varsayar. Bkz. Android SDK’da çağrı sırası.

Kurallar ve tuzaklar

Bunu yapınBunu yapmayınNeden
Göstereceğiniz placement’ı çekin ya da önbelleği preloadFlows ile ısıtın (SDK 4.1+).Başlatma sırasında kendi eşzamanlı getFlow çağrılarınızı oluşturun.Elle yazılmış bir önceden çekme patlaması ana iş parçacığını bloke eder ve siyah ekrana yol açar. preloadFlows bunun için tasarlanmıştır ve toplu işlemi sizin adınıza eşzamanlı olarak çalıştırır.
Attribution’ın çözümlenmesi için bir şans tanındıktan sonra getFlow’u çekin — örneğin, activate’den 1–2 saniye sonra veya setOnProfileUpdatedListener tetiklendikten sonra.getFlow’u Application.onCreate() içinde çağırın.Attribution henüz gelmemiştir. Flow varsayılan kitleye göre çözümlenir ve segment ile ASA kişiselleştirmesini sessizce atlar.
Bir loadTimeout ayarlayın ve her placement için bir yedek paywall yapılandırın.getFlow’u süresiz bekleyin.Zaman aşımı olmadan, kötü bağlantıya sahip kullanıcılar ağ çözümlenene kadar boş bir ekran görür — ya da uygulamayı kapatır.

fetchPolicy ve loadTimeout parametre referansı için Paywall ve ürünleri getirme sayfasına, doğru placement seçimi için ise Placement’lar sayfasına bakın.

Placement’leri önceden yükle

Info

preloadFlows ve preloadFlowsForDefaultAudience, SDK sürüm 4.1’den itibaren kullanılabilir.

preloadFlows, flow JSON’ını önceden önbelleğe alır — her placement için bir istek gönderilir. Ardından her zamanki gibi kullanabilirsiniz: flow için getFlow, görünüm yapılandırması için getFlowConfiguration.

fetchPolicy, sonraki getFlow çağrısının hangi katmanı önce okuyacağını belirler; önbelleğe erişip erişemeyeceğini değil:

  • ReturnCacheDataElseLoad önce önceden yüklenmiş kopyayı okur ve yalnızca önbellekte hiçbir şey yoksa ağa gider. ReturnCacheDataIfNotExpiredElseLoad(maxAgeMillis) ise kopya maxAgeMillis’den daha yeni olduğu sürece aynı şeyi yapar.
  • Varsayılan olan ReloadRevalidatingCacheData önce ağa gider ve istek başarısız olduğunda ya da zaman aşımına uğradığında önceden yüklenmiş kopyaya düşer.

Önceden yükleme her iki durumda da işe yarar, ancak farklı biçimlerde: önbellek öncelikli bir politika isteği tamamen ortadan kaldırırken, varsayılan politika isteği korur ve geri düşülecek sıcak bir kopya elde eder.

Bunu, session’ın hangi placement’ları ihtiyaç duyacağını bildiğinizde ama henüz göstermek istemediğinizde kullanın — örneğin, activate ve identify çözümlendikten hemen sonra, kullanıcının henüz dokunmadığı bir düğmenin arkasındaki flow için.

Parametreler:

  • placementIds (zorunlu): önceden yüklenecek placement’lar. Boş ve tekrar eden ID’ler göz ardı edilir.
  • loadTimeout (isteğe bağlı): her bir placement’a ayrı ayrı uygulanan zaman aşımı süresi; toplu işlemin tamamına değil. Varsayılan değer 5 saniyedir; 1 saniyenin altındaki değerler otomatik olarak 1 saniyeye yükseltilir.

Bilinmesi gereken davranışlar:

  • Callback, her placement denendikten sonra tetiklenir ve placement başına düşen hataları birlikte raporlar. Bir placement’taki hata diğerlerini durdurmaz.
  • Bir placement zaman aşımına uğrarsa, sunucu hatası alırsa veya ağ hatasıyla karşılaşırsa SDK, o placement için yedek varyantlara geri döner. Diğer hatalar olduğu gibi raporlanır.
  • Ön yükleme yalnızca önbelleği ısıtır. İçerik döndürmez — içeriği görüntülemek için yine getFlow çağırmanız gerekir.

Bir ön yüklemenin kapsadıkları

Bir flow ekrana katman katman ulaşır. Ön yükleme, tıpkı getFlow gibi yalnızca ilk katmanı kapsar:

KatmanKimler tarafından getirilirÖn yüklemeyle hazırlanır mı
Flow JSON — seçilen varyant, ürün kimlikleri ve remote configgetFlowEvet
UI düzeni — ekranın yapısı, stili ve metnigetFlowConfigurationHayır
Görseller (video öğesinin yerine geçen durağan kare dahil)getFlowConfiguration, arka plandaHayır
Video dosyalarıEkran render edilirken sistem oynatıcısıSDK tarafından önbelleğe alınmaz

getFlowConfiguration layout için bekler; bu nedenle belirli bir layout’un ilk isteği, ön yükleme sonrasında bile bir tam gidiş-dönüş süresine mal olur. SDK, bu layout’u kendi disk önbelleğinde tutar; bu önbellek uygulama yeniden başlatmalarından sonra da hayatta kalır ve herhangi bir ağ çağrısından önce okunur. Dolayısıyla bu maliyet her istekte değil, yalnızca ilk istekte ortaya çıkar. SDK layout’u aldıktan sonra, çağrıdan bağımsız olarak görselleri önbelleğe almaya başlar: ekranı bekletmez ve bu işlem tamamlandığında herhangi bir callback veya hata bildirilmez.

Hangi placement’ın başarısız olduğunu öğrenin

Callback, REQUEST_FAILED (2005) koduyla tüm toplu işlemi kapsayan bir AdaptyPreloadPlacementsError alır. Tek tek hataları görmek için preloadErrors özelliğini okuyun — placement ID’sine göre anahtarlanmış bir map:

Adapty.preloadFlows(listOf("onboarding", "main_paywall")) { error ->
    if (error is AdaptyPreloadPlacementsError) {
        error.preloadErrors.forEach { (placementId, placementError) ->
            // log or retry the individual placement
        }
    }
}

preloadErrors yalnızca AdaptyPreloadPlacementsError üzerinde bulunur; bu nedenle önce türü doğrulayın — başka herhangi bir AdaptyError, placement bazında bir hata dışındaki bir kaynaktan gelmiştir.

Kitle segmentasyonunu atla

Kitle segmentasyonunu hiç beklemeden önbelleği ısıtmak için varsayılan kitle varyantını kullanın. loadTimeout almaz:

Adapty.preloadFlowsForDefaultAudience(listOf("main_paywall")) { error -> }

İlk ekran medyasını uygulama paketinden gösterme

Bir flow, resimlerini ve videolarını Adapty’den indirir. İlk ekranın medyasını anında göstermek için bu medyayı uygulama paketinden sunabilirsiniz. Bu, zaten gönderdiğiniz medyaları (örneğin mevcut bir yerel onboarding görselleri) yeniden kullanmanın iyi bir yoludur.

  1. Flow & Paywall Builder’da görsel veya videoya bir özel medya ID’si ayarlayın. Oraya yüklediğiniz dosya yedek olarak kalır.
  2. Dosyayı uygulamanızın res/raw veya assets klasörüne ekleyin.
  3. getFlowView ile flow görünümünü oluştururken, customAssets içinde ilgili ID için paketlenmiş dosyayı belirtin:
// "welcome_video" is the custom media ID set in the Flow & Paywall Builder
val bundledAssets = AdaptyCustomAssets.of(
    "welcome_video" to
            AdaptyCustomVideoAsset.file(
                FileLocation.fromResId(requireContext(), R.raw.welcome),
                preview = AdaptyCustomImageAsset.file(
                    FileLocation.fromResId(requireContext(), R.drawable.welcome_poster),
                ),
                resolution = AdaptyCustomVideoAsset.Resolution(width = 1080, height = 1920),
            ),
)

val flowView = AdaptyUI.getFlowView(
    activity,
    flowConfiguration,
    products,
    eventListener,
    insets,
    bundledAssets,
)

Paketlenen dosyalar uygulamanızın indirme boyutunu artırdığından, yalnızca kullanıcıların ilk gördüğü medyayı paketleyin.

Paketlemediğiniz medyalar yine de hemen görünür: görünüm yapılandırması, bir videonun sabit karesi de dahil olmak üzere her görüntünün küçük, düşük çözünürlüklü bir kopyasını taşır ve tam dosya yüklenene kadar bunu gösterir.

customAssets referansının tamamı için bkz. Varlıkları özelleştirme.

Zayıf bağlantı için ayarlama

Sürekli zayıf bağlantı olan pazarlar için (kırsal alanlar, toplu taşıma güzergahları, yönlendirme sorunlarından etkilenen bölgeler):

  • İlk fetch hariç her fetch işleminde fetchPolicy değerini AdaptyPlacementFetchPolicy.ReturnCacheDataElseLoad olarak ayarlayın.
  • Adapty kontrol panelinde her placement için bir yedek paywall yapılandırın.
  • loadTimeout değerini 3–5 saniye olarak ayarlayın ve zaman aşımı gerçekleştiğinde yedek paywalla geçin.
  • Flow gösterimi için getProfile sonucunu beklemeyin. getFlow fonksiyonunu bağımsız olarak çağırın; böylece yavaş bir profil yükleme işlemi arayüzü bloke etmez.