Kotlin Multiplatform satın alma ve Ödeme Duvarları Genel Bakış

0:02:00

RevenueCat'in KMP (Kotlin Multiplatform) SDK Codelab'ına hoş geldiniz!

Bu codelab'de şunları öğreneceksiniz:

Kotlin Multiplatform projesine RevenueCat KMP SDK'yı entegre etme KMP uygulamasında uygulama içi satın alma uygulama Ücretli ve ücretsiz kullanıcıları ayırt etme yöntemini öğrenme Sunucu tabanlı UI yaklaşımına dayalı ödeme duvarı ekranı oluşturma

Bu codelab'ı tamamladığınızda KMP uygulamasında uygulama içi satın almayı başarıyla uygulayabilecek ve RevenueCat'in KMP SDK'sını kullanarak dinamik ödeme duvarını gösterebileceksiniz.

overview

RevenueCat SDK İçe Aktarma

0:07:00

Uygulama içi satın almayı uygulamadan önce, önce mevcut veya yeni projenize RevenueCat SDK'yı eklemeniz gerekir. Başlamak için build.gradle.kts dosyasına aşağıdaki bağımlılığı ekleyin:

GitHub'da en son sürümü kontrol edebilirsiniz.

gradle
[versions]
purchases-kmp = "1.8.6+14.0.2"

[libraries]
purchases-core = { module = "com.revenuecat.purchases:purchases-kmp-core", version.ref = "purchases-kmp" }
purchases-ui = { module = "com.revenuecat.purchases:purchases-kmp-ui", version.ref = "purchases-kmp" }

Şimdi modülün build.gradle.kts dosyasındaki commonMain kaynak setine bağımlılığı ekleyebilirsiniz.

gradle
kotlin {
    // ...
    sourceSets {
        // ...
        commonMain.dependencies {
            // purchases-kmp bağımlılığını ekleyin.
            implementation(libs.purchases.core)
            implementation(libs.purchases.ui)
        }
    }
}

ExperimentalForeignApi seçim

SDK, native iOS kodu için Kotlin oluşturulmuş bağlamalarını kullandığından iOS kaynak setinde ExperimentalForeignApi'yi seçmeniz gerekir. Bunu etkinleştirmek için modülün build.gradle.kts dosyasına aşağıdaki yapılandırmayı ekleyin:

kotlin
kotlin {
    // ...
    sourceSets {
        // ...
        named { it.lowercase().startsWith("ios") }.configureEach {
            languageSettings {
                optIn("kotlinx.cinterop.ExperimentalForeignApi")
            }
        }
    }
}

Native iOS SDK'yı Bağlama

SDK, PurchasesHybridCommon adlı native RevenueCat iOS framework'üne bağlı olduğundan mevcut iOS projenize bağlamanız gerekir. Bu codelab'de CocoaPods kullanarak native iOS SDK'yı yapılandıracağız.

Kotlin projesinin tamamını CocoaPods bağımlılığı olarak dahil edebilirsiniz. Bunu yapmak için oluşturulan .podspec dosyasını içeren dizinin adını ve yolunu belirterek projenin Podfile'ındaki bağımlılığı belirtin.

  1. Sürüm kataloğuna Kotlin CocoaPods Gradle plugin'i ve purchases-common sürümünü ekleyin.
gradle/libs.versions.toml dosyasındaki [plugins] bloğuna aşağıdakini ekleyin:
gradle
[versions]
#  version purchases-kmp sürümündeki '+' işaretinden sonraki her şeyle aynı olmalıdır.
purchases-common = "13.3.0"

[plugins]
kotlin-cocoapods = { id = "org.jetbrains.kotlin.native.cocoapods", version.ref = "kotlin" }
  1. Kök build.gradle.kts dosyasındaki plugins {} bloğuna aşağıdaki alias'ı ekleyin:
gradle
alias(libs.plugins.kotlin.cocoapods) apply false
  1. CocoaPods'u entegre etmek istediğiniz modülde (örn: composeApp) plugins {} bloğuna aynı alias'ı ekleyin:
gradle
alias(libs.plugins.kotlin.cocoapods)
  1. Aşağıdaki gibi cocoapods ortamını yapılandırın:
kotlin
kotlin {
    cocoapods {
        // Gerekli özellikler
        // Burada gerekli Pod sürümünü belirtin
        // Aksi takdirde Gradle proje sürümü kullanılır
        version = "1.0"
        summary = "Some description for a Kotlin/Native module"
        homepage = "Link to a Kotlin/Native module homepage"

        // İsteğe bağlı özellik
        // Gradle proje adını değiştirmek yerine burada Pod adını yapılandırın
        name = "MyCocoaPod"

        // .. Diğer Cocoapods seçenekleri burada. 

        // PurchasesHybridCommon bağımlılığını ekleyin.
        pod("PurchasesHybridCommon") {
            version = libs.versions.purchases.common.get()
            extraOpts += listOf("-compiler-option", "-fmodules")
        }
    }
}
  1. Son olarak Podfile'ın iOS uygulama hedefine aşağıdaki post_install betiğini ekleyin. Örneğin, Kotlin Multiplatform modülünün adı shared ise betik aşağıdaki gibidir:
text
target 'iosApp' do
  use_frameworks!
  platform :ios, '16.0'
  pod 'shared', :path => '../shared', :platforms => :ios

  # Aşağıdaki post_install betiğini ekleyin:
  post_install do |installer|
    installer.pods_project.targets.each do |target|
      if target.name == 'shared'
        target.build_configurations.each do |config|
          config.build_settings.delete('ASSETCATALOG_COMPILER_APPICON_NAME')
        end
      end
    end
  end
end

RevenueCat SDK'yı başarıyla içe aktardınız. Şimdi başlatma adımına geçelim.

başlatma

0:02:00

Şimdi projede Purchases SDK'yı başlatma zamanı. Project Settings > Platforms'da bulabileceğiniz yalnızca public API anahtarını kullanarak Purchases'ı yapılandırın.

kotlin
import com.revenuecat.purchases.kmp.LogLevel
import com.revenuecat.purchases.kmp.Purchases
import com.revenuecat.purchases.kmp.configure

// Ortak başlatma mantığınız varsa oradan configure()'ı çağırın. Aksi takdirde,
// her platformun uygulama yaşam döngüsü başlangıcında çağırın.
// Not: Her platform için doğru api anahtarını kullanmanız gerekir.
// Bunun için Kotlin Multiplatform'un expect/actual mekanizmasını kullanabilirsiniz.

Purchases.logLevel = LogLevel.DEBUG
Purchases.configure(apiKey = "<google_or_apple_api_key>") {
    appUserId = "<app_user_id>"
    // Diğer yapılandırma seçenekleri.
}

.configure metodunun app_user_id alanı, RevenueCat uygulamasında kullanıcıyı tanımlamak için kullanılır. Özel bir kullanıcı tanımlayıcısı sağlayabilir veya RevenueCat'in otomatik olarak anonim bir ID oluşturmasına izin vermek için atlayabilirsiniz. Daha fazla bilgi için Kullanıcı Tanımlama Kılavuzu'na bakın.

Harika! Bununla uygulamanın %50'sini tamamladınız.

Yetkileri Doğrulama

0:03:00

Şimdi kullanıcı entitlement'ını doğrulama adımına geçelim.

Daha önce belirtildiği gibi, entitlement'lar kullanıcının satın alma sonrasında kilidini açtığı erişim seviyelerini veya özellikleri temsil eder. Bu, reklam banner'ı gösterip göstermeyeceğinizi veya premium erişim verip vermeyeceğinizi belirlemede kullanışlıdır.

Aşağıdaki kod parçasını kullanarak kullanıcının aktif entitlement'a sahip olup olmadığını kolayca kontrol edebilirsiniz:

kotlin
val ENTITLEMENT_IDENTIFIER = ".." // RevenueCat panelinden belirli entitlement tanımlayıcısını alın
val customerInfo = Purchases.sharedInstance.awaitCustomerInfo()
val isEntitled = customerInfo?.entitlements[ENTITLEMENT_IDENTIFIER]?.isActive == true

Kullanıcının belirli bir entitlement'a sahip olup olmadığını kontrol ettikten sonra, uygulamanın iş modeline göre nasıl ilerleyeceğinizi belirleyebilirsiniz.

Örneğin, uygulama reklam destekliyse AdMob banner'ını göstermeyi veya gizlemeyi seçebilirsiniz. Ya da ödeme duvarı veya satın alma diyaloğu göstererek kullanıcının gelişmiş özelliklerin veya içeriğin kilidini açmasını sağlayabilirsiniz.

Bu mantığı uygulamanın bir örneği aşağıdaki gibidir:

kotlin
@Composable
fun ContentScreen(isEntitled: Boolean) {
    if (isEntitled) {
      // Kullanıcı bu entitlement'a erişim yetkisine sahipse. Banner göstermeye gerek yok.
    } else {
      // Burada banner arayüzünü veya ödeme duvarını gösterin
      ..
    }
}

Uygulama İçi Satın Alma Uygulama

0:04:00

Şimdi reklamsız deneyim sunmak için uygulama içi satın almayı uygulayalım. Başlamak için önce RevenueCat panelinden ilgili ürün bilgilerini almanız gerekir. Bu ürün verileri kullanıcıya satın alma seçeneklerini göstermek için kullanılır.

Aşağıdaki örnekte gösterildiği gibi Purchases.sharedInstance.awaitGetProducts()'ı çağırarak mevcut ürünleri alabilirsiniz:

kotlin
// RevenueCat sunucusundan ürün bilgilerini alır
val products = Purchases.sharedInstance.awaitGetProducts(
  productIds = listOf("paywall_tester.subs"),
)

// Uygulama içi satın alma işlemini gerçekleştirir
val purchaseResult = Purchases.sharedInstance.awaitPurchase(
  storeProduct = products.first()
)

paywall_tester.subs:weekly, paywall_tester.subs:monthly, paywall_tester.subs:yearly gibi birden fazla ürün varyasyonu sunuyorsanız, productIds alanının değeri olarak varsayılan ürün tanımlayıcısı olan paywall_tester.subs'ı kullanarak ürün aramasını basitleştirebilirsiniz. Bu şekilde RevenueCat tüm ilgili ürün varyasyonlarını liste olarak getirir, böylece ödeme duvarı UI'ında dinamik olarak gösterebilirsiniz.

Ürün verilerini aldıktan sonra Purchases.sharedInstance.awaitPurchase(product)'ı çağırarak uygulama içi satın alma akışını başlatabilirsiniz. Bu şekilde Google Play satın alma diyaloğu otomatik olarak tetiklenir ve kullanıcı işlemi uygulama içinde tamamlayabilir.

Bu şekilde makbuz, mağaza API'si veya satın alma doğrulamasını manuel olarak işlemenin karmaşıklığı olmadan yalnızca birkaç satır kodla tam işlevli uygulama içi satın alma akışını entegre edebilirsiniz.

Ödeme Duvarı Uygulama

0:07:00

Şimdi Compose Multiplatform kullanarak KMP projesinde ödeme duvarını uygulama zamanı.

İş Mantığı

Başlamak için RevenueCat panelinden şu anki offering'i almanız gerekir. Offering, aylık, yıllık veya ömür boyu planlar gibi kullanıcıya sunulan mevcut satın alma seçeneklerini tanımlar. Aşağıdaki örnekte açıklandığı gibi Purchases.sharedInstance.awaitOfferings() metodunu kullanarak bunu kolayca yapabilirsiniz.

kotlin
internal class DetailsRepositoryImpl : DetailsRepository {

  override fun fetchOffering(): Flow<ApiResponse<Offering>> = flow {
    try {
      val offerings = Purchases.sharedInstance.awaitOfferings()
      offerings.current?.let { currentOffering ->
        val response = ApiResponse.of { currentOffering }
        emit(response)
      }
    } catch (e: PurchasesException) {
      ApiResponse.exception(e)
    }
  }
}

RevenueCat KMP SDK Kotlin coroutine'ler için native destek sağlar, bu da coroutine tabanlı mimari kullanan projeler için mükemmel uyum sağlar. Şu anki offering Flow olarak da sunulur, böylece değişiklikleri reaktif olarak gözlemleyebilir ve UI'ı buna göre güncelleyebilirsiniz.

Compose Multiplatform ile Ödeme Duvarı UI Oluşturma

Bu noktada her şey hazır olmalıdır. com.revenuecat.purchases:purchases-kmp-ui SDK'yı zaten eklediyseniz, Compose Multiplatform kullanarak ödeme duvarı UI'ını kolayca oluşturabilirsiniz.

RevenueCat'in UI kütüphanesi PaywallDialog gibi yerleşik bileşenler sağlar, böylece ödeme duvarı ekranını veya diyaloğunu hızla gösterebilirsiniz. Bu bileşenler tamamen özelleştirilebilir ve uygulamanızın tasarımına uyacak şekilde görünümü ve davranışı ayarlamak için çeşitli yapılandırma seçenekleri sunar.

Compose Multiplatform kullanarak ödeme duvarını uygulamanın ve özelleştirmenin ne kadar basit olduğunu gösteren bir örnek aşağıdaki gibidir:

kotlin
val currentOffering by viewModel.offering.collectAsState()

val options = remember {
    PaywallOptions(dismissRequest = { TODO("Handle dismiss") }) {
        offering = currentOffering
        shouldDisplayDismissButton = true
    }
}

Paywall(options)

Yapılandırma tamamlandı! Artık kullanıcı gerekli entitlement'a sahip olmadığında, Paywall Editor'de yapılandırdığınız tasarımla aynı şekilde ödeme duvarını gösterebilirsiniz.

Codelab: RevenueCat Google Play Entegrasyonu (Ödeme Duvarı Oluşturma)'da gördüğünüz gibi, ödeme duvarı sistemi sunucu tabanlı UI üzerine kuruludur. Bu, uygulama güncellemesi göndermeden veya inceleme sürecinden geçmeden panelden doğrudan ödeme duvarının içeriğini ve tasarımını dinamik olarak güncelleyebileceğiniz anlamına gelir.

Sonuç

Bu codelab'de RevenueCat KMP SDK'yı entegre etmeyi, uygulama içi satın almayı uygulamayı ve Compose Multiplatform'da ödeme duvarı oluşturmayı öğrendiniz. Şimdi uygulamanızı yayınlama ve daha fazla gelir elde etme zamanı!

Aşağıdaki kaynakları kullanarak RevenueCat SDK kullanımı hakkında daha fazla bilgi edinebilirsiniz:

  • Ürün Eğitimleri: RevenueCat'i kullanmaya başlamanıza ve en iyi şekilde yararlanmanıza yardımcı olacak video eğitimleri.