Capacitor SDK'da hataları yönetin
SDK tarafından döndürülen her hata bir AdaptyError örneğidir. İşte bir örnek:
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 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ı
| Hata | Kod | Açıklama |
|---|---|---|
| unknown | 0 | Bilinmeyen veya beklenmedik bir hata oluştuğunu belirtir. |
| clientInvalid | 1 | İstemcinin denediği işlemi gerçekleştirmesine izin verilmediğini belirtir. |
| paymentCancelled | 2 | 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 ya da daha sonra hatırlatabilirsiniz. |
| paymentInvalid | 3 | Ödeme parametrelerinden birinin mağaza tarafından tanınmadığını belirtir. |
| paymentNotAllowed | 4 | Kullanıcının ödeme yapmaya yetkili olmadığını belirtir. Olası nedenler: - Ödemeler, kullanıcının ülkesinde desteklenmiyordur. - Kullanıcı reşit değildir. |
| storeProductNotAvailable | 5 | İstenen ürünün App Store’da bulunmadığını belirtir. Ürünün ilgili ülkede kullanılabilir olduğundan emin olun. |
| cloudServicePermissionDenied | 6 | Kullanıcının Cloud hizmeti bilgilerine erişime izin vermediğini belirtir. |
| cloudServiceNetworkConnectionFailed | 7 | Cihazın ağa bağlanamadığını belirtir. |
| cloudServiceRevoked | 8 | Kullanıcının bu bulut hizmetini kullanma iznini iptal ettiğini belirtir. |
| privacyAcknowledgementRequired | 9 | Kullanıcının mağaza gizlilik politikasını henüz onaylamadığını belirtir. |
| unauthorizedRequestData | 10 | İsteğin hatalı oluşturulduğunu belirtir. |
| invalidOfferIdentifier | 11 | Teklif tanımlayıcısı geçerli değil. Olası nedenler: - App Store’da bu tanımlayıcıyla bir teklif oluşturmamışsınızdır. - Teklifi iptal etmişsinizdir. - Teklif kimliğini yanlış yazmışsınızdır. |
| invalidSignature | 12 | Ödeme indirimindeki imzanın geçersiz olduğunu 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. |
| missingOfferParams | 13 | Bu hata, Adapty entegrasyonunda veya tekliflerde sorun olduğunu gösterir. Kurulum hakkında ayrıntılı bilgi 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ı belirtir. Teklifler her zaman indirimli bir fiyatı yansıtmalıdır. |
Özel Android Kodları
| Hata | Kod | Açıklama |
|---|---|---|
| adaptyNotInitialized | 20 | Adapty SDK’yı Adapty.activate metoduyla doğru şekilde yapılandırmanız gerekiyor. React Native için nasıl yapılacağını öğrenin. |
| productNotFound | 22 | Satın alınmak istenen ürünün mağazada mevcut olmadığını belirtir. |
| invalidJson | 23 | Paywall JSON’ı geçerli değil. Adapty Kontrol Paneli’nde düzeltin. Nasıl düzelteceğiniz hakkında ayrıntılı bilgi için Paywall’u remote config ile özelleştirme konusuna bakın. |
| currentSubscriptionToUpdateNotFoundInHistory | 24 | Yenilenmesi gereken orijinal abonelik bulunamadı. |
| pendingPurchase | 25 | Satın alma durumunun tamamlanmış değil, beklemede olduğunu belirtir. Ayrıntılar için Android Developer belgelerindeki Beklemedeki işlemleri yönetme sayfasına bakın. |
| billingServiceTimeout | 97 | İstek, Google Play yanıt veremeden önce maksimum zaman aşımına ulaştığında bu hata oluşur. Örneğin Play Billing Library çağrısının talep ettiği işlemin yürütülmesindeki bir gecikme bu duruma yol açabilir. |
| featureNotSupported | 98 | İstenen özellik, geçerli cihazda Play Store tarafından desteklenmiyor. |
| billingServiceDisconnected | 99 | İstemci uygulamasının BillingClient üzerinden Google Play Store hizmetiyle kurduğu bağlantının kesildiğini belirten önemli bir hatadır. |
| billingServiceUnavailable | 102 | Google Play Billing hizmetinin şu anda kullanılamadığını belirten geçici bir hatadır. Çoğu durumda, istemci cihaz ile Google Play Billing hizmetleri arasında bir ağ bağlantısı sorunu vardır. |
| billingUnavailable | 103 | Satın alma sürecinde kullanıcı kaynaklı bir faturalama hatası oluştuğunu belirtir. Bu hatanın oluşabileceği durumlar: 1. Kullanıcının cihazındaki Play Store uygulaması güncel değildir. 2. Kullanıcı desteklenmeyen bir ülkededir. 3. Kullanıcı kurumsal bir kullanıcıdır ve kurumsal yöneticisi satın almaları devre dışı bırakmıştır. 4. Google Play, kullanıcının ödeme yöntemini tahsil edememektedir. Örneğin, kullanıcının kredi kartının süresi dolmuş olabilir. 5. Kullanıcı Play Store uygulamasında oturum açmamıştır. |
| developerError | 105 | Bir API’nin yanlış kullanıldığını gösteren önemli bir hatadır. |
| billingError | 106 | Google Play’in kendi içinde bir sorun olduğunu gösteren önemli bir hatadır. |
| itemAlreadyOwned | 107 | Consumable ürün zaten satın alınmış. |
| itemNotOwned | 108 | İstenen öğe üzerindeki işlemin başarısız olduğunu belirtir. |
Özel StoreKit Kodları
| Hata | Kod | Açıklama |
|---|---|---|
| noProductIDsFound | 1000 | 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 eklendiğ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ğini unutmayın. 4. Apple vergi ayarlarında uygulama ücretli durumunun etkin olduğunu onaylayın. Vergi bilgilerinizin güncel ve sertifikalarınızın geçerli olduğundan emin olun. 5. Uygulamanın gelir elde etmeye uygun olması için bir banka hesabının eklendiğini kontrol edin. 6. Ürünlerin tüm bölgelerde mevcut olduğunu kontrol edin. Ayrıca ürünlerinizin “Ready to Submit” durumunda olduğundan emin olun. |
| productRequestFailed | 1002 | Şu anda mevcut ürünler alınamıyor. Olası neden: - Henüz önbellek oluşturulmamış ve aynı anda internet bağlantısı yok. |
| cantMakePayments | 1003 | Bu cihazda uygulama içi satın almalara izin verilmiyor. |
| noPurchasesToRestore | 1004 | Google Play’in geri yüklenecek satın alma bulamadığını belirtir. |
| cantReadReceipt | 1005 | Cihazda geçerli bir makbuz yok. Bu durum sandbox testleri sırasında sorun çıkarabilir. Herhangi bir işlem yapmanız gerekmez; ancak iş mantığı açısından kullanıcıya indirim teklif edebilir ya da daha sonra hatırlatabilirsiniz. |
| productPurchaseFailed | 1006 | Ürün satın alma başarısız oldu. |
| refreshReceiptFailed | 1010 | Makbuzun alınamadığını belirtir. 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ı Adapty.activate metoduyla doğru şekilde yapılandırmanız gerekiyor. React Native için nasıl yapılacağını öğrenin. |
| badRequest | 2003 | Hatalı istek. |
| serverError | 2004 | Sunucu hatası. |
| networkFailed | 2005 | Ağ isteği başarısız oldu. |
| decodingFailed | 2006 | Yanıt çözümlemesinin başarısız olduğunu belirtir. |
| encodingFailed | 2009 | İstek kodlamasının başarısız olduğunu belirtir. |
| analyticsDisabled | 3000 | Analytics olaylarını devre dışı bıraktığınız için işleyemiyoruz. Ayrıntılar için Analytics entegrasyonu konusuna bakın. |
| wrongParam | 3001 | Parametrelerinizden bazılarının hatalı olduğunu belirtir: boş bırakılamayacak alanlar boş bırakılmış ya da yanlış tür kullanılmıştır vb. |
| activateOnceError | 3005 | .activate metodu birden fazla kez çağrılamaz. |
| profileWasChanged | 3006 | İşlem sırasında kullanıcı profili değişti. |
| fetchTimeoutError | 3101 | Paywall belirlenen süre içinde alınamadı. Bu durumu önlemek için yerel yedekler ayarlayın. |
| operationInterrupted | 9000 | Bu işlem sistem tarafından kesintiye uğratıldı. |