Capacitor SDK'da hataları yönetin

SDK tarafından döndürülen her hata bir AdaptyError örneğidir. İşte bir örnek:

Hata ayıklamadan önce ayrıntılı logları etkinleştirin. Çoğu AdaptyError, altta yatan bir StoreKit, Play Billing, ağ veya backend hatasını sarmalayan bir yapıya sahiptir. Ayrıntılı loglar açıkken (adapty.setLogLevel({ logLevel: 'verbose' }) — bkz. Loglama), sarmalanan hata konsola yazdırılır ve bu genellikle gerçek nedeni gösterir. AdaptyError üzerindeki detail özelliği log düzeyinden bağımsız olarak doldurulur — ayrıntılı loglar onu yalnızca konsolda görünür kılar.


try {
  const result = await adapty.makePurchase({ product });
  
  // Handle purchase result
  if (result.type === 'success') {
    console.log('Purchase successful:', result.profile);
  } else if (result.type === 'user_cancelled') {
    console.log('User cancelled the purchase');
  } else if (result.type === 'pending') {
    console.log('Purchase is pending');
  }
} catch (error) {
  if (error instanceof AdaptyError) {
    console.error('Adapty error:', error.adaptyCode, error.localizedDescription);
    
    // Handle specific error codes
    switch (error.adaptyCode) {
      case ErrorCodeName.cantMakePayments:
        console.log('In-app purchases are not allowed on this device');
        break;
      case ErrorCodeName.notActivated:
        console.log('Adapty SDK is not activated');
        break;
      case ErrorCodeName.productPurchaseFailed:
        console.log('Purchase failed:', error.detail);
        break;
      default:
        console.log('Other error occurred:', error.detail);
    }
  } else {
    console.error('Non-Adapty error:', error);
  }
}

Hata Özellikleri

AdaptyError sınıfı aşağıdaki özellikleri sağlar:

ÖzellikTürAçıklama
adaptyCodenumberSayısal hata kodu (ör. 1003, cantMakePayments için)
localizedDescriptionstringKullanıcı dostu hata mesajı
detailstring | undefinedEk hata ayrıntıları (isteğe bağlı)
messagestringKod ve açıklamayı içeren tam hata mesajı

Hata Kodları

SDK, hata kodlarıyla çalışmak için sabitler ve yardımcı araçlar sunar:

ErrorCodeName Sabiti

Dize tanımlayıcılarını sayısal kodlarla eşleştirir:


ErrorCodeName.cantMakePayments // 1003
ErrorCodeName.notActivated // 2002
ErrorCodeName.networkFailed // 2005

ErrorCode Sabiti

Sayısal kodları dize tanımlayıcılarıyla eşleştirir:


ErrorCode[1003] // 'cantMakePayments'
ErrorCode[2002] // 'notActivated'
ErrorCode[2005] // 'networkFailed'

Yardımcı Fonksiyonlar


// Get numeric code from string name:
getErrorCode('cantMakePayments') // 1003

// Get string name from numeric code:
getErrorPrompt(1003) // 'cantMakePayments'

Hata Kodlarını Karşılaştırma

Önemli: error.adaptyCode bir sayı olduğundan, doğrudan sayısal kodlarla karşılaştırın:

// Option 1: Use ErrorCodeName constant (recommended) ✅
if (error.adaptyCode === ErrorCodeName.cantMakePayments) {
  console.log('Cannot make payments');
}

// Option 2: Compare with numeric literal ✅
if (error.adaptyCode === 1003) {
  console.log('Cannot make payments');
}

// NOT like this ❌ - compares number to string and will never match
if (error.adaptyCode === ErrorCode[1003]) {
}

Global Hata Yöneticisi

Tüm Adapty hatalarını yakalamak için global bir hata yöneticisi kurabilirsiniz:


// Set up global error handler
AdaptyError.onError = (error: AdaptyError) => {
  console.error('Global Adapty error:', {
    code: error.adaptyCode,
    message: error.localizedDescription,
    detail: error.detail
  });
  
  // Handle specific error types globally
  if (error.adaptyCode === ErrorCodeName.notActivated) {
    // SDK not activated - maybe retry activation
    console.log('SDK not activated, attempting to reactivate...');
  }
};

Yaygın Hata Yönetimi Kalıpları

Satın Alma Hatalarını Yönetme


async function handlePurchase(product: AdaptyPaywallProduct) {
  try {
    const result = await adapty.makePurchase({ product });
    
    if (result.type === 'success') {
      console.log('Purchase successful:', result.profile);
    } else if (result.type === 'user_cancelled') {
      console.log('User cancelled the purchase');
    } else if (result.type === 'pending') {
      console.log('Purchase is pending');
    }
  } catch (error) {
    if (error instanceof AdaptyError) {
      switch (error.adaptyCode) {
        case ErrorCodeName.cantMakePayments:
          console.log('In-app purchases not allowed');
          break;
        case ErrorCodeName.productPurchaseFailed:
          console.log('Purchase failed:', error.detail);
          break;
        default:
          console.error('Purchase error:', error.localizedDescription);
      }
    }
  }
}

Ağ Hatalarını Yönetme


async function fetchPaywall(placementId: string) {
  try {
    const paywall = await adapty.getPaywall({ placementId });
    return paywall;
  } catch (error) {
    if (error instanceof AdaptyError) {
      switch (error.adaptyCode) {
        case ErrorCodeName.networkFailed:
          console.log('Network error, retrying...');
          // Implement retry logic
          break;
        case ErrorCodeName.serverError:
          console.log('Server error:', error.detail);
          break;
        case ErrorCodeName.notActivated:
          console.log('SDK not activated');
          break;
        default:
          console.error('Paywall fetch error:', error.localizedDescription);
      }
    }
    throw error;
  }
}

Sistem StoreKit Kodları

HataKodAçıklama
unknown0Bilinmeyen veya beklenmedik bir hata oluştuğunu belirtir.
clientInvalid1İstemcinin denenen işlemi gerçekleştirmesine izin verilmediğini belirtir.
paymentCancelled2

Kullanıcının ödeme isteğini iptal ettiğini belirtir.

Herhangi bir işlem yapmanız gerekmez; ancak iş mantığı açısından kullanıcıya indirim teklif edebilir veya daha sonra hatırlatabilirsiniz.

paymentInvalid3Ödeme parametrelerinden birinin mağaza tarafından tanınmadığını belirtir.
paymentNotAllowed4

Kullanıcının ödeme yapmasına izin verilmediğini belirtir. Olası nedenler:

- Kullanıcının bulunduğu ülkede ödemeler desteklenmiyor.

- Kullanıcı reşit değil.

storeProductNotAvailable5İstenen ürünün App Store’da mevcut olmadığını belirtir. Ürünün kullanılan ülke için geçerli olduğundan emin olun.
cloudServicePermissionDenied6Kullanıcının Cloud servisi bilgilerine erişime izin vermediğini belirtir.
cloudServiceNetworkConnectionFailed7Cihazın ağa bağlanamadığını belirtir.
cloudServiceRevoked8Kullanıcının bu cloud servisini kullanma iznini iptal ettiğini belirtir.
privacyAcknowledgementRequired9Kullanıcının mağaza gizlilik politikasını henüz onaylamadığını belirtir.
unauthorizedRequestData10İsteğin hatalı oluşturulduğunu belirtir.
invalidOfferIdentifier11

Teklif tanımlayıcısı geçerli değil. Olası nedenler:

- App Store’da bu tanımlayıcıyla bir teklif oluşturmadınız.

- Teklifi iptal ettiniz.

- Teklif ID’sini yanlış girdiniz.

invalidSignature12Ödeme indirimindeki imzanın geçerli olmadığını belirtir. In-app purchase Key ID alanını doldurduğunuzdan ve In-App Purchase Private Key dosyasını yüklediğinizden emin olun. Ayrıntılar için App Store entegrasyonunu yapılandırma konusuna bakın.
missingOfferParams13

Bu hata, Adapty entegrasyonuyla veya tekliflerle ilgili sorunlara işaret eder.

Nasıl yapılandırılacağı hakkında ayrıntılar için App Store entegrasyonunu yapılandırma ve Teklifler konularına bakın.

invalidOfferPrice14Mağazada belirlediğiniz fiyatın artık geçerli olmadığını belirtir. Teklifler her zaman indirimli bir fiyatı temsil etmelidir.

Özel Android Kodları

HataKodAçıklama
adaptyNotInitialized20Adapty SDK’yı Adapty.activate metoduyla düzgün şekilde yapılandırmanız gerekiyor. React Native için nasıl yapılacağını öğrenin.
productNotFound22Satın alınmak istenen ürünün mağazada mevcut olmadığını belirtir.
invalidJson23Paywall JSON’ı geçerli değil. Adapty Kontrol Paneli’nde düzeltin. Nasıl düzeltileceği hakkında ayrıntılar için Paywall’u remote config ile özelleştirme konusuna bakın.
currentSubscriptionToUpdateNotFoundInHistory24Yenilenmesi gereken orijinal abonelik geçmişte bulunamadı.
pendingPurchase25Satın alma durumunun tamamlanmış değil, beklemede olduğunu belirtir. Ayrıntılar için Android Developer belgelerindeki Bekleyen işlemleri yönetme sayfasına bakın.
billingServiceTimeout97Google Play’in yanıt veremeden önce isteğin maksimum zaman aşımına ulaştığını belirtir. Bu durum, örneğin Play Billing Library çağrısının istenen işlemi yürütmesinde gecikme yaşanmasından kaynaklanabilir.
featureNotSupported98İstenen özellik, mevcut cihazda Play Store tarafından desteklenmiyor.
billingServiceDisconnected99Bu kritik hata, istemci uygulamanın BillingClient aracılığıyla Google Play Store servisine olan bağlantısının kesildiğini belirtir.
billingServiceUnavailable102Bu geçici hata, Google Play Billing servisinin şu anda kullanılamadığını belirtir. Çoğu durumda bu, istemci cihaz ile Google Play Billing servisleri arasında herhangi bir noktada ağ bağlantısı sorunu olduğu anlamına gelir.
billingUnavailable103

Satın alma işlemi sırasında kullanıcı kaynaklı bir faturalama hatası oluştuğunu belirtir. Bu hatanın oluşabileceği durumlar şunlardır:

1. Kullanıcının cihazındaki Play Store uygulaması güncel değil.

2. Kullanıcı desteklenmeyen bir ülkede.

3. Kullanıcı bir kurumsal hesap kullanıyor ve kurumsal yönetici satın alma işlemlerini devre dışı bırakmış.

4. Google Play, kullanıcının ödeme yöntemini tahsil edemiyor. Örneğin, kullanıcının kredi kartı süresi dolmuş olabilir.

5. Kullanıcı Play Store uygulamasında oturum açmamış.

developerError105Bu kritik hata, bir API’nin yanlış kullanıldığını belirtir.
billingError106Bu kritik hata, Google Play’in kendi içinde bir sorun olduğunu belirtir.
itemAlreadyOwned107Consumable ürün zaten satın alınmış.
itemNotOwned108İstenen işlemin öğe üzerinde başarısız olduğunu belirtir.

Özel StoreKit Kodları

HataKodAçıklama
noProductIDsFound1000

Paywall’daki ürünlerin hiçbirinin mağazada mevcut olmadığını belirtir.

Bu hatayla karşılaşıyorsanız çözmek için aşağıdaki adımları izleyin:

1. Tüm ürünlerin Adapty Kontrol Paneli’ne eklenip eklenmediğini kontrol edin.

2. Uygulamanızın Bundle ID’sinin Apple Connect’tekiyle eşleştiğinden emin olun.

3. Uygulama mağazalarındaki ürün tanımlayıcılarının Kontrol Paneli’ne eklediğinizle eşleştiğini doğrulayın. Tanımlayıcıların, mağazada zaten dahil değilse Bundle ID içermemesi gerektiğine dikkat edin.

4. Apple vergi ayarlarında uygulamanın ücretli durumunun aktif olduğunu onaylayın. Vergi bilgilerinizin güncel ve sertifikalarınızın geçerli olduğundan emin olun.

5. Uygulamanın monetizasyona uygun olabilmesi için bir banka hesabının bağlı olup olmadığını kontrol edin.

6. Ürünlerin tüm bölgelerde kullanılabilir olup olmadığını kontrol edin. Ayrıca ürünlerinizin “Ready to Submit” durumunda olduğundan emin olun.

productRequestFailed1002

Şu anda mevcut ürünler alınamıyor. Olası neden:

- Henüz önbellek oluşturulmamış ve aynı zamanda internet bağlantısı yok.

cantMakePayments1003Bu cihazda Uygulama İçi Satın Almalara izin verilmiyor.
noPurchasesToRestore1004Google Play’in geri yüklenecek satın alma bulamadığını belirtir.
cantReadReceipt1005

Cihazda geçerli bir makbuz yok. Bu durum sandbox testleri sırasında sorun oluşturabilir.

Herhangi bir işlem yapmanız gerekmez; ancak iş mantığı açısından kullanıcıya indirim teklif edebilir veya daha sonra hatırlatabilirsiniz.

productPurchaseFailed1006Ürün satın alımı başarısız oldu. Bu hata, altta yatan bir StoreKit hatasını sarmalamaktadır — gerçek nedeni öğrenmek için sarmalanan hatayı okuyun (veya konsolda görmek için ayrıntılı logları etkinleştirin). Sarmalanan hata genellikle yukarıdaki tablodaki 0–14 arasındaki StoreKit kodlarından biridir; en yaygın olanları paymentCancelled, paymentInvalid, paymentNotAllowed veya invalidOfferPrice’tır. Belirli bir neden tespit edemiyorsanız yeni bir sandbox profili deneyin; sorun devam ederse Apple desteğiyle iletişime geçin.
refreshReceiptFailed1010Makbuzun alınamadığını belirtir. Yalnızca StoreKit 1 için geçerlidir.
receiveRestoredTransactionsFailed1011Satın alma geri yükleme başarısız oldu.

Özel Ağ Kodları

HataKodAçıklama
notActivated2002Adapty SDK’yı Adapty.activate metoduyla düzgün şekilde yapılandırmanız gerekiyor. React Native için nasıl yapılacağını öğrenin.
badRequest2003Hatalı istek.
serverError2004Sunucu hatası.
networkFailed2005Ağ isteği başarısız oldu.
decodingFailed2006Yanıt kod çözme işleminin başarısız olduğunu belirtir.
encodingFailed2009İstek kodlama işleminin başarısız olduğunu belirtir.
analyticsDisabled3000Analytics olaylarını işleyemiyoruz çünkü bu özelliği devre dışı bıraktınız. Ayrıntılar için Analytics entegrasyonu konusuna bakın.
wrongParam3001Bazı parametrelerinizin hatalı olduğunu belirtir: boş bırakılamayacak alanlar boş bırakılmış ya da yanlış türde değer girilmiş olabilir.
activateOnceError3005.activate metodu birden fazla kez çağrılamaz.
profileWasChanged3006İşlem sırasında kullanıcı profili değiştirildi.
fetchTimeoutError3101Paywall’un belirlenen süre içinde alınamadığını belirtir. Bu durumu önlemek için yerel yedekler ayarlayın.
operationInterrupted9000Bu işlem sistem tarafından kesildi.