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:
| Özellik | Tür | Açıklama |
|---|---|---|
adaptyCode | number | Sayısal hata kodu (ör. 1003, cantMakePayments için) |
localizedDescription | string | Kullanıcı dostu hata mesajı |
detail | string | undefined | Ek hata ayrıntıları (isteğe bağlı) |
message | string | Kod 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 fetchFlow(placementId: string) {
try {
const flow = await adapty.getFlow({ placementId });
return flow;
} 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ı
| Hata | Kod | Açıklama |
|---|---|---|
| unknown | 0 | Bilinmeyen veya beklenmedik bir hata oluştuğunu gösterir. |
| clientInvalid | 1 | İstemcinin gerçekleştirmeye çalıştığı işlemi yapmasına izin verilmediğini gösterir. |
| paymentCancelled | 2 | Kullanıcının ödeme isteğini iptal ettiğini gösterir. Herhangi bir işlem yapmanız gerekmez; ancak iş mantığı açısından kullanıcınıza bir indirim sunabilir ya da daha sonra hatırlatabilirsiniz. |
| paymentInvalid | 3 | Ödeme parametrelerinden birinin mağaza tarafından tanınmadığını gösterir. |
| paymentNotAllowed | 4 | Kullanıcının ödeme yapmaya yetkili olmadığını gösterir. Olası nedenler: - Ödemeler, kullanıcının ülkesinde desteklenmiyor. - Kullanıcı reşit değil. |
| storeProductNotAvailable | 5 | İstenen ürünün App Store’da bulunmadığını gösterir. Ürünün kullanılan ülkede mevcut olduğundan emin olun. |
| cloudServicePermissionDenied | 6 | Kullanıcının Cloud servis bilgilerine erişime izin vermediğini gösterir. |
| cloudServiceNetworkConnectionFailed | 7 | Cihazın ağa bağlanamadığını gösterir. |
| cloudServiceRevoked | 8 | Kullanıcının bu bulut servisini kullanma iznini iptal ettiğini gösterir. |
| privacyAcknowledgementRequired | 9 | Kullanıcının mağaza gizlilik politikasını henüz onaylamadığını gösterir. |
| unauthorizedRequestData | 10 | İsteğin hatalı oluşturulduğunu gösterir. |
| invalidOfferIdentifier | 11 | 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ış yazdınız. |
| invalidSignature | 12 | Ödeme indirimindeki imzanın geçerli olmadığını gösterir. 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. |
| missingOfferParams | 13 | Bu hata, Adapty entegrasyonunda veya tekliflerde sorun olduğunu gösterir. Nasıl kurulacağına dair ayrıntılar için App Store entegrasyonunu yapılandırma ve Teklifler konularına bakın. |
| invalidOfferPrice | 14 | Mağazada belirttiğiniz fiyatın artık geçerli olmadığını gösterir. Teklifler her zaman indirimli bir fiyatı temsil etmelidir. |
Özel Android Kodları
| Hata | Kod | Açıklama |
|---|---|---|
| adaptyNotInitialized | 20 | Adapty SDK’yı activate yöntemiyle düzgün şekilde yapılandırmanız gerekiyor. Nasıl yapacağınızı öğrenmek için Adapty SDK’yı yükle ve yapılandır konusuna bakın. |
| productNotFound | 22 | Satın alınmak istenen ürünün mağazada mevcut olmadığını gösterir. |
| currentSubscriptionToUpdateNotFoundInHistory | 24 | Yenilenmesi gereken orijinal abonelik bulunamadı. |
| billingServiceTimeout | 97 | İsteğin, Google Play yanıt verebilmeden önce maksimum zaman aşımına ulaştığını gösterir. Bu durum, örneğin Play Billing Library çağrısının istediği işlemin yürütülmesindeki bir gecikmeden kaynaklanabilir. |
| featureNotSupported | 98 | İstenen özellik, mevcut cihazda Play Store tarafından desteklenmiyor. |
| billingServiceDisconnected | 99 | Bu kritik hata, istemci uygulamanın BillingClient aracılığıyla Google Play Store hizmetiyle olan bağlantısının kesildiğini gösterir. |
| billingServiceUnavailable | 102 | Bu geçici hata, Google Play Billing hizmetinin şu anda kullanılamadığını gösterir. Çoğu durumda bu, istemci cihaz ile Google Play Billing hizmetleri arasında bir ağ bağlantısı sorunu olduğu anlamına gelir. |
| billingUnavailable | 103 | Bu hata, satın alma işlemi sırasında kullanıcı faturalama hatası oluştuğunu gösterir. Bu durumun gerçekleşebileceği örnekler: 1. Kullanıcının cihazındaki Play Store uygulaması güncel değil. 2. Kullanıcı desteklenmeyen bir ülkede. 3. Kullanıcı kurumsal bir kullanıcı ve kurumsal yöneticisi 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ının süresi dolmuş olabilir. 5. Kullanıcı Play Store uygulamasına giriş yapmamış. |
| developerError | 105 | Bir API’yi hatalı kullandığınızı gösteren kritik bir hatadır. |
| billingError | 106 | Google Play’in kendisinde dahili bir sorun olduğunu gösteren kritik bir hatadır. |
| itemAlreadyOwned | 107 | Consumable ürün zaten satın alınmış. |
| itemNotOwned | 108 | İstek yapılan öğe üzerindeki işlemin başarısız olduğunu gösterir. |
| billingNetworkError | 112 | Cihaz ile Play sistemleri arasındaki ağ bağlantısında sorun yaşandığını gösterir. |
Özel StoreKit Kodları
| Hata | Kod | Açıklama |
|---|---|---|
| noProductIDsFound | 1000 | Bu hata, paywall’daki ürünlerin hiçbirinin mağazada mevcut olmadığını gösterir. Bu hatayla karşılaşıyorsanız lütfen çö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ğinizlerle 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ınızda uygulama ücretli durumunun aktif olduğunu onaylayın. Vergi bilgilerinizin güncel olduğundan ve sertifikalarınızın geçerli olduğundan emin olun. 5. Uygulamaya para kazanmaya uygun olması için bir banka hesabının bağlı olup olmadığını kontrol edin. 6. Ürünlerin tüm bölgelerde mevcut olup olmadığını kontrol edin. Ayrıca ürünlerinizin “Ready to Submit” durumunda olduğundan emin olun. |
| productRequestFailed | 1002 | Şu anda mevcut ürünler getirilemiyor. Olası neden: - Henüz önbellek oluşturulmamış ve aynı anda internet bağlantısı yok. |
| cantMakePayments | 1003 | Bu cihazda Uygulama İçi Satın Almalar’a izin verilmiyor. |
| noPurchasesToRestore | 1004 | Google Play’in geri yüklenecek satın alma bulamadığını gösterir. |
| cantReadReceipt | 1005 | Cihazda geçerli bir makbuz yok. Bu, sandbox testleri sırasında sorun oluşturabilir. Herhangi bir işlem yapmanız gerekmez; ancak iş mantığı açısından kullanıcınıza bir indirim sunabilir ya da daha sonra hatırlatabilirsiniz. |
| productPurchaseFailed | 1006 | Ürün satın alma başarısız oldu. Bu, temel alınan bir StoreKit hatasını kapsar — gerçek nedeni görmek için sarmalanan hatayı okuyun (veya konsolda görmek için ayrıntılı günlükleri etkinleştirin). Sarmalanan hata genellikle yukarıdaki tablodaki 0–14 arası StoreKit kodlarından biridir; en sık karşılaşılanlar paymentCancelled, paymentInvalid, paymentNotAllowed veya invalidOfferPrice’tır. Belirli bir neden tespit edemiyorsanız yeni bir sandbox profili deneyin; hâlâ başarısız olursa Apple desteğiyle iletişime geçin. |
| refreshReceiptFailed | 1010 | Makbuzun alınamadığını gösterir. Yalnızca StoreKit 1 için geçerlidir. |
| receiveRestoredTransactionsFailed | 1011 | Satın alma geri yükleme başarısız oldu. |
Özel Ağ Kodları
| Hata | Kod | Açıklama |
|---|---|---|
| notActivated | 2002 | Adapty SDK’yı activate yöntemiyle düzgün şekilde yapılandırmanız gerekiyor. Nasıl yapacağınızı öğrenmek için Adapty SDK’yı yükle ve yapılandır konusuna bakın. |
| badRequest | 2003 | Hatalı istek. |
| serverError | 2004 | Sunucu hatası. |
| networkFailed | 2005 | Ağ isteği başarısız oldu. |
| decodingFailed | 2006 | Yanıt kod çözümünün başarısız olduğunu gösterir. |
| encodingFailed | 2009 | İstek kodlamasının başarısız olduğunu gösterir. |
| analyticsDisabled | 3000 | Analytics olaylarını işleyemiyoruz çünkü bunu devre dışı bıraktınız. Ayrıntılar için Analytics entegrasyonu konusuna bakın. |
| wrongParam | 3001 | Bazı parametrelerinizin doğru olmadığını gösterir: boş olamayacakken boş veya yanlış tür vb. |
| activateOnceError | 3005 | .activate yöntemi birden fazla kez çağrılamaz. |
| profileWasChanged | 3006 | İşlem sırasında kullanıcı profili değiştirildi. |
| unsupportedData | 3007 | Veri formatının SDK tarafından desteklenmediğini gösterir. |
| persistingDataError | 3100 | Veri kaydedilirken hata oluştu. |
| fetchTimeoutError | 3101 | Paywall’ın belirlenen süre içinde getirilemediği anlamına gelir. Bu durumu önlemek için yerel yedekler ayarlayın. |
| operationInterrupted | 9000 | Bu işlem sistem tarafından kesintiye uğratıldı. |