Flutter SDK'yı Kur ve Yapılandır

Adapty SDK, Flutter uygulamanıza sorunsuz entegrasyon için iki temel modül içerir:

  • Core Adapty: Bu temel SDK, Adapty’nin uygulamanızda düzgün çalışması için gereklidir.
  • AdaptyUI: Adapty Paywall Builder’ı kullanıyorsanız bu modüle ihtiyaç duyarsınız. Paywall Builder, platformlar arası paywall’lar oluşturmak için kod gerektirmeyen, kullanımı kolay bir araçtır.

Adapty SDK’nın bir mobil uygulamaya nasıl entegre edildiğini gerçek bir örnekle görmek ister misiniz? Paywall gösterme, satın alma yapma ve diğer temel işlevleri kapsayan örnek uygulamamıza göz atın.

Gereksinimler

Adapty SDK iOS 13.0+ sürümünü destekler; ancak paywall builder ile oluşturulan paywall’larla düzgün çalışabilmesi için iOS 15.0+ gereklidir.

Adapty, Google Play Billing Library 8.x sürümüne kadar uyumludur. Varsayılan olarak Adapty, Google Play Billing Library v7.0.0 ile çalışır; ancak daha yeni bir sürümü zorlamak istiyorsanız bağımlılığı manuel olarak ekleyebilirsiniz.

SDK’yı yüklemek, Adapty kurulumunun 5. adımıdır. Uygulamanızda satın almalar çalışmadan önce uygulamanızı mağazalara bağlamanız, ardından Adapty Kontrol Paneli’nde ürünler, bir paywall ve bir placement oluşturmanız gerekir. Hızlı başlangıç kılavuzu tüm gerekli adımları anlatmaktadır.

Adapty SDK’yı Yükleyin

Release

  1. Adapty’yi pubspec.yaml dosyanıza ekleyin:

    dependencies: 
      adapty_flutter: ^<the latest SDK version>
  2. Bağımlılıkları yüklemek için aşağıdaki komutu çalıştırın:

    flutter pub get
  3. Adapty SDK’larını uygulamanıza aktarın:

    import 'package:adapty_flutter/adapty_flutter.dart';

Adapty SDK’nın Adapty modülünü etkinleştirme

Adapty SDK’yı uygulama kodunuzda etkinleştirin.

Adapty SDK, uygulamanızda yalnızca bir kez etkinleştirilmesi gerekir.

Public SDK Key’inizi almak için:

  1. Adapty Kontrol Paneli’ne gidin ve App settings → General sayfasına gidin.
  2. Api keys bölümünden Public SDK Key’i kopyalayın (Secret Key’i değil).
  3. Koddaki "YOUR_PUBLIC_SDK_KEY" ifadesini değiştirin.

Ya da Adapty CLI kullanarak programatik olarak alın:

npm install -g adapty
adapty auth login
adapty apps list

Ya da doğrudan:

npx adapty auth login
adapty apps list
  • Adapty başlatma işlemi için Public SDK key kullandığınızdan emin olun; Secret key yalnızca sunucu taraflı API için kullanılmalıdır.
  • SDK key’leri her uygulama için benzersizdir, bu nedenle birden fazla uygulamanız varsa doğru olanı seçtiğinizden emin olun.

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    _initializeAdapty();

    super.initState();
  }

  Future<void> _initializeAdapty() async {
    try {
      await Adapty().activate(
        configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY'),
      );
    } catch (e) {
      // handle the error
    }
  }

  Widget build(BuildContext context) {
    return Text("Hello");
  }
}

Diğer Adapty SDK metodlarını çağırmadan önce activate işleminin tamamlanmasını bekleyin. Tam sıralama için Flutter SDK’da çağrı sırası bölümüne bakın.

Şimdi uygulamanızda paywallları ayarlayın:

AdaptyUI modülünü etkinleştirme

Paywall Builder kullanmayı planlıyorsanız ve AdaptyUI modülünü kurduysanız, AdaptyUI’yi de etkinleştirmeniz gerekir:

AdaptyUI ile ilgili bağımlılıklar, AdaptyUI etkin olup olmadığından bağımsız olarak uygulamanıza bağlanır.

Kodunuzda, AdaptyUI’yi etkinleştirmeden önce Adapty çekirdek modülünü etkinleştirmeniz gerekir.

await Adapty().activate(
  configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
    ..withActivateUI(true), // This automatically activates AdaptyUI
);

İsteğe bağlı kurulum

Günlük Kaydı

Günlük kayıt sistemini kurma

Adapty, neler olduğunu anlamanıza yardımcı olmak için hataları ve diğer önemli bilgileri günlüğe kaydeder. Kullanılabilir günlük seviyeleri şunlardır:

SeviyeAçıklama
AdaptyLogLevel.noneHiçbir şey loglanmaz. Varsayılan değer
AdaptyLogLevel.errorYalnızca hatalar loglanır
AdaptyLogLevel.warnHatalar ve SDK’dan kritik hatalara yol açmayan ancak dikkat edilmesi gereken mesajlar loglanır.
AdaptyLogLevel.infoHatalar, uyarılar ve çeşitli bilgi mesajları loglanır.
AdaptyLogLevel.verboseHata ayıklama sırasında işe yarayabilecek ek bilgiler (fonksiyon çağrıları, API sorguları vb. gibi) loglanır.
Adapty’yi yapılandırmadan önce uygulamanızda log seviyesini ayarlayabilirsiniz:
// Set log level before activation. 
// 'verbose' is recommended for development and the first production release
await Adapty().setLogLevel(AdaptyLogLevel.verbose);

// Or set it during configuration
await Adapty().activate(
  configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
    ..withLogLevel(AdaptyLogLevel.verbose),
);

Veri politikaları

Adapty, siz açıkça göndermediğiniz sürece kullanıcılarınızın kişisel verilerini depolamaz; ancak mağaza veya ülke yönergelerine uymak için ek veri güvenliği politikaları uygulayabilirsiniz.

IP adresi toplama ve paylaşmayı devre dışı bırakma

Adapty modülünü etkinleştirirken, kullanıcı IP adresi toplama ve paylaşımını devre dışı bırakmak için ipAddressCollectionDisabled değerini true olarak ayarlayın. Varsayılan değer false’tur. IP adresine dayalı özellikler uygulamanız için gerekli değilse, kullanıcı gizliliğini artırmak, GDPR veya CCPA gibi bölgesel veri koruma düzenlemelerine uymak ya da gereksiz veri toplamayı azaltmak amacıyla bu parametreyi kullanın.

await Adapty().activate(
  configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
    ..withIpAddressCollectionDisabled(true),
);

Reklam kimliği toplama ve paylaşımını devre dışı bırakma

Adapty modülünü etkinleştirirken, reklam tanımlayıcılarının toplanmasını devre dışı bırakmak için appleIdfaCollectionDisabled (iOS) veya googleAdvertisingIdCollectionDisabled (Android) parametresini true olarak ayarlayın. Varsayılan değer false’tur.

Bu parametreyi App Store/Play Store politikalarına uymak, App Tracking Transparency istemini tetiklemekten kaçınmak veya uygulamanız reklam attribution’ı ya da reklam kimliklerine dayalı analitik gerektirmiyorsa kullanın.

await Adapty().activate(
  configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
    ..withAppleIdfaCollectionDisabled(true)      // iOS
    ..withGoogleAdvertisingIdCollectionDisabled(true), // Android
);

AdaptyUI için medya önbellek yapılandırmasını ayarlayın

Modül, Adapty SDK ile birlikte otomatik olarak etkinleştirilir. Paywall Builder kullanmıyorsanız ve AdaptyUI modülünü devre dışı bırakmak istiyorsanız, etkinleştirme sırasında withActivateUI(false) parametresini geçirin. Varsayılan olarak AdaptyUI, performansı artırmak ve ağ kullanımını azaltmak için medyayı (resim ve video gibi) önbelleğe alır. Özel bir yapılandırma sağlayarak önbellek ayarlarını özelleştirebilirsiniz.

Varsayılan önbellek boyutunu ve geçerlilik süresini geçersiz kılmak için withMediaCacheConfiguration kullanın. Bu isteğe bağlıdır; bu yöntemi çağırmazsanız varsayılan değerler kullanılır (100 MB disk boyutu, sınırsız bellek sayısı). Ancak yapılandırmayı kullanıyorsanız tüm parametreler eklenmelidir.


final mediaCacheConfig = AdaptyUIMediaCacheConfiguration(
  memoryStorageTotalCostLimit: 200 * 1024 * 1024, // 200 MB
  memoryStorageCountLimit: 2147483647, // max int value
  diskStorageSizeLimit: 200 * 1024 * 1024, // 200 MB
);

await Adapty().activate(
  configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
    ..withMediaCacheConfiguration(mediaCacheConfig),
);

Parametreler:

ParametreVarlıkAçıklama
memoryStorageTotalCostLimitisteğe bağlıBellekteki toplam önbellek boyutu (bayt cinsinden). Varsayılan değer 100 MB’tır.
memoryStorageCountLimitisteğe bağlıBellek depolamasının öğe sayısı sınırı. Varsayılan değer maksimum int değeridir.
diskStorageSizeLimitisteğe bağlıDiskteki dosya boyutu sınırı (bayt cinsinden). Varsayılan değer 100 MB’tır.

Yerel access level’ları etkinleştir (Android)

Varsayılan olarak yerel access level’lar iOS’ta etkin, Android’de devre dışıdır. Android’de de etkinleştirmek için withGoogleLocalAccessLevelAllowed değerini true olarak ayarlayın:

await Adapty().activate(
  configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
    ..withGoogleLocalAccessLevelAllowed(true),
);

Yedekten geri yükleme sırasında verileri temizle

clearDataOnBackup değeri true olarak ayarlandığında SDK, uygulamanın iCloud yedeğinden geri yüklendiğini algılar ve önbelleğe alınmış profil bilgileri, ürün ayrıntıları ve paywalllar dahil tüm yerel SDK verilerini siler. SDK ardından temiz bir durumla başlatılır. Varsayılan değer false’tur.

Yalnızca yerel SDK önbelleği silinir. Apple ile yapılan işlem geçmişi ve Adapty sunucularındaki kullanıcı verileri değişmeden kalır.

await Adapty().activate(
  configuration: AdaptyConfiguration(apiKey: 'YOUR_PUBLIC_SDK_KEY')
    ..withClearDataOnBackup(true) // default – false 
);

Sorun Giderme

Android yedekleme kuralları (Otomatik Yedekleme yapılandırması)

Bazı SDK’lar (Adapty dahil) kendi Android Auto Backup yapılandırmasını içerir. Yedekleme kurallarını tanımlayan birden fazla SDK kullanıyorsanız, Android manifest birleştirme işlemi android:fullBackupContent, android:dataExtractionRules veya android:allowBackup ile ilgili bir hatayla başarısız olabilir.

Tipik hata belirtileri: Manifest merger failed: Attribute application@dataExtractionRules value=(@xml/your_data_extraction_rules) is also present at [com.other.sdk:library:1.0.0] value=(@xml/other_sdk_data_extraction_rules)

Bu değişiklikler Android platform dizininizde yapılmalıdır (genellikle projenizin android/ klasöründe bulunur).

Sorunu çözmek için şunları yapmanız gerekir:

  • Manifest birleştirme işlemine, yedeklemeyle ilgili özellikler için uygulamanızın değerlerini kullanmasını söyleyin.

  • Adapty’nin kurallarını diğer SDK’ların kurallarıyla birleştiren yedekleme kuralı dosyaları oluşturun.

1. Manifestinize tools ad alanını ekleyin

AndroidManifest.xml dosyanızda, kök <manifest> etiketinin tools içerdiğinden emin olun:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.app">

    ...
</manifest>

2. <application> içinde yedekleme özelliklerini geçersiz kılın

Aynı AndroidManifest.xml dosyasında, <application> etiketini güncelleyerek uygulamanızın nihai değerleri sağlamasını ve manifest birleştirme işlemine kütüphane değerlerini değiştirmesini söyleyin:

<application
android:name=".App"
android:allowBackup="true"
android:fullBackupContent="@xml/sample_backup_rules"           
android:dataExtractionRules="@xml/sample_data_extraction_rules"
tools:replace="android:fullBackupContent,android:dataExtractionRules">

    ...
</application>

Herhangi bir SDK de android:allowBackup ayarlıyorsa, bunu tools:replace içine ekleyin:

tools:replace="android:allowBackup,android:fullBackupContent,android:dataExtractionRules"

3. Birleştirilmiş yedekleme kuralı dosyaları oluşturun

Android projenizin res/xml/ dizininde, Adapty’nin kurallarını diğer SDK’ların kurallarıyla birleştiren XML dosyaları oluşturun. Android, işletim sistemi sürümüne bağlı olarak farklı yedekleme kuralı formatları kullandığından, her iki dosyayı da oluşturmak uygulamanızın desteklediği tüm Android sürümleriyle uyumluluk sağlar.

Aşağıdaki örneklerde örnek bir üçüncü taraf SDK olarak AppsFlyer kullanılmaktadır. Uygulamanızda kullandığınız diğer SDK’lar için kuralları değiştirin veya ekleyin.

Android 12 ve üzeri için (yeni veri çıkarma kuralları formatını kullanır):

<?xml version="1.0" encoding="utf-8"?>
<data-extraction-rules>
    <cloud-backup>
        
        <exclude domain="sharedpref" path="appsflyer-data"/>
        <exclude domain="sharedpref" path="appsflyer-purchase-data"/>
        <exclude domain="database" path="afpurchases.db"/>
        
        <exclude domain="sharedpref" path="AdaptySDKPrefs.xml"/>
    </cloud-backup>

    <device-transfer>
        
        <exclude domain="sharedpref" path="appsflyer-data"/>
        <exclude domain="sharedpref" path="appsflyer-purchase-data"/>
        <exclude domain="database" path="afpurchases.db"/>
        <exclude domain="sharedpref" path="AdaptySDKPrefs.xml"/>
    </device-transfer>
</data-extraction-rules>

Android 11 ve altı için (eski tam yedekleme içeriği formatını kullanır):

<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
    
    <exclude domain="sharedpref" path="appsflyer-data"/>

    
    <exclude domain="sharedpref" path="AdaptySDKPrefs.xml"/>

    

Android’de başka bir uygulamadan geri döndükten sonra satın almalar başarısız oluyor

Satın alma akışını başlatan Activity, varsayılan olmayan bir launchMode kullanıyorsa, kullanıcı Google Play’den, bir bankacılık uygulamasından veya tarayıcıdan geri döndüğünde Android bu Activity’yi yanlış şekilde yeniden oluşturabilir veya yeniden kullanabilir. Bu durum, satın alma sonucunun kaybolmasına ya da iptal edilmiş olarak değerlendirilmesine yol açabilir.

Satın almaların düzgün çalışmasını sağlamak için, satın alma akışını başlatan Activity’de yalnızca standard veya singleTop başlatma modlarını kullanın; diğer modlardan kaçının. AndroidManifest.xml dosyanızda, satın alma akışını başlatan Activity’nin standard veya singleTop olarak ayarlandığından emin olun:

<activity
    android:name=".MainActivity"
    android:launchMode="standard" />

Podfile SWIFT_VERSION geçersiz kılmasından kaynaklanan Swift 6 derleme hataları

Flutter uygulamanızı iOS için derlerken Adapty pod hedeflerinde Swift 6 derleme hataları görebilirsiniz. Tipik belirtiler arasında AdaptyUIBuilderLogic içinde @Sendable uyumsuzlukları, Adapty türlerinde eksik Sendable uyumu veya aktör izolasyon hataları yer alır. Adapty pod’ları s.swift_version = '6.0' bildirir ve derlemek için Swift 6 gerektirir. Kendi uygulama kodunuz Swift 5’te kalabilir — yalnızca Adapty pod hedeflerinin (Adapty, AdaptyUI, AdaptyUIBuilder, AdaptyLogger, AdaptyPlugin) Swift 6 ile derlenmesi gerekir.

En yaygın neden, ios/Podfile içindeki her pod hedefi için SWIFT_VERSION’ı yeniden yazan bir post_install kancasıdır:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['SWIFT_VERSION'] = '5.9'
    end
  end
end

Düzeltme: Adapty pod hedeflerini geçersiz kılma işleminin dışında tutun:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    next if %w[Adapty AdaptyUI AdaptyUIBuilder AdaptyLogger AdaptyPlugin].include?(target.name)
    target.build_configurations.each do |config|
      config.build_settings['SWIFT_VERSION'] = '5.9'
    end
  end
end

Ardından ios/ dizininden pod install komutunu çalıştırın ve yeniden derleyin.

Doğrulamak için ios/Pods/Pods.xcodeproj dosyasını açın, Adapty pod hedefini seçin → Build SettingsSwift Language Version. Değerin Swift 6 olması gerekir.