iOS SDK'da hataları yönetin
Adapty SDK, tüm hata türleri için AdaptyError adında kendi sarmalayıcısına sahiptir. Temel olarak SDK tarafından döndürülen her hata bir AdaptyError’dır. Aşağıda açıklanan iki kullanışlı özelliği vardır: originalError ve adaptyErrorCode.
originalError, orijinal hatayla çalışmanız gerektiğinde başvurabileceğiniz orijinal hatayı içerir. SKError, NSError veya genel bir Swift Error olabilir. Bu özellik isteğe bağlıdır; çünkü bazı hatalar (tutarsız veya eksik veriler gibi) doğrudan SDK tarafından üretilir ve etrafında wrapper oluşturulan orijinal bir hataya sahip olmayabilir.
adaptyErrorCode, aşağıdaki gibi yaygın sorunları ele almak için kullanılabilir:
- geçersiz kimlik bilgileri
- ağ hataları
- iptal edilen ödemeler
- faturalama sorunları
- geçersiz makbuz
- ve çok daha fazlası
Belirli kodlar için hatayı kontrol etmek ve buna göre tepki vermek oldukça kolaydır.
do {
let info = try await Adapty.makePurchase(product: product)
} catch {
if error.adaptyErrorCode == .paymentCancelled {
// purchase was cancelled
// you can offer discount to your user or remind them later
}
}
Hata ayıklamadan önce ayrıntılı logları etkinleştirin. Çoğu AdaptyError, altta yatan bir StoreKit, ağ veya backend hatasını sarar. Ayrıntılı loglar açıkken (Adapty.logLevel = .verbose — bkz. Loglama), sarılmış hata konsola yazdırılır ve bu genellikle gerçek nedeni gösterir. originalError özelliği log seviyesinden bağımsız olarak doldurulur — ayrıntılı loglar yalnızca bunu konsolda görünür kılar.
Bu çözümler sorununuzu gidermezse, destek ekibiyle iletişime geçmeden önce atmamız gereken adımlar için Diğer sorunlar bölümüne bakın.
StoreKit hataları
| Hata | Kod | Çözüm |
|---|---|---|
| unknown | 0 | Bilinmeyen veya beklenmedik bir hata oluştuğunu belirten hata kodu. Yeniden deneyin veya Diğer sorunlar bölümüne bakın. |
| clientInvalid | 1 | İstemcinin gerçekleştirmeye çalıştığı işleme izin verilmediğini belirten hata kodu. |
| paymentCancelled | 2 | Kullanıcının ödeme isteğini iptal ettiğini belirten hata kodu. Herhangi bir işlem yapılması gerekmez; ancak iş mantığı açısından kullanıcıya indirim sunabilir veya daha sonra hatırlatabilirsiniz. |
| paymentInvalid | 3 | Ödeme parametrelerinden birinin App Store tarafından tanınmadığını belirten hata. |
| paymentNotAllowed | 4 | Kullanıcının ödeme yapmasına izin verilmediğini belirten hata kodu. |
| storeProductNotAvailable | 5 | İstenen ürünün mağazada mevcut olmadığını belirten hata kodu. Uygulamayı yeniden yüklemeyi deneyin. |
| cloudServicePermissionDenied | 6 | Kullanıcının Cloud servisi bilgilerine erişime izin vermediğini belirten hata kodu. |
| cloudServiceNetworkConnectionFailed | 7 | Cihazın ağa bağlanamadığını belirten hata kodu. |
| cloudServiceRevoked | 8 | Kullanıcının bu cloud servisini kullanma iznini iptal ettiğini belirten hata kodu. |
| privacyAcknowledgementRequired | 9 | Kullanıcının henüz Apple’ın gizlilik politikasını onaylamadığını belirten hata kodu. |
| unauthorizedRequestData | 10 | Uygulamanın, gerekli yetkilendirmeye sahip olmadığı bir özelliği kullanmaya çalıştığını belirten hata kodu. |
| invalidOfferIdentifier | 11 | Teklifin AppStore Connect’te istediğiniz tekliflerin kurulu olduğundan ve geçerli bir teklif tanımlayıcısı ilettiğinizden emin olun. |
| invalidSignature | 12 | Ödeme indirimindeki imzanın geçersiz olduğunu belirten hata kodu. |
| missingOfferParams | 13 | Ödeme indiriminde parametrelerin eksik olduğunu belirten hata kodu. |
| invalidOfferPrice | 14 | App Store Connect’te belirttiğiniz fiyatın artık geçerli olmadığını belirten hata kodu. Teklifler her zaman indirimli bir fiyatı temsil etmelidir. |
| noProductIDsFound | 1000 | Paywallda talep ettiğiniz ürünlerin hiçbirinin App Store’da listelenmesine rağmen satın alma için mevcut olmadığını belirten hata. Bu hata bazen bir Bu hatayla karşılaşıyorsanız Kod-1000 |
| productRequestFailed | 1002 | Şu anda mevcut ürünler alınamıyor. |
| cantMakePayments | 1003 | Bu cihazda uygulama içi satın almalara izin verilmiyor. Sorun giderme kılavuzuna bakın. |
| cantReadReceipt | 1005 | Cihazda geçerli bir makbuz yok. Bu, sandbox testleri sırasında sorun olabilir. Sandbox ortamında gerçek bir satın alma yapana kadar geçerli bir makbuz dosyanız olmaz; bu nedenle makbuz dosyasına erişmeden önce bir satın alma yaptığınızdan emin olun. Sandbox testleri sırasında cihazda geçerli bir Apple sandbox hesabıyla oturum açtığınızdan da emin olun. |
| productPurchaseFailed | 1006 | Ürün satın alma işlemi başarısız oldu. Bu hata, altta yatan bir StoreKit hatasını sarmalıyor; gerçek nedeni görmek için originalError okuyun (veya konsolda görmek için ayrıntılı günlükleri etkinleştirin). Sarmalanan hata genellikle yukarıdaki tablodaki StoreKit kodlarından 0–14 arasında 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. |
| refreshReceiptFailed | 1010 | Makbuz yenileme işlemi başarısız oldu. |
| fetchSubscriptionStatusFailed | 1020 | App Store’dan abonelik durumu alınamadı. |
| unknownTransactionId | 1030 | İşlem tanımlayıcısı bilinmiyor. |
| paymentPendingError | 1050 | Ödeme şu anda beklemede. |
| billingPlanUnavailable | 1060 | Ürün, bu cihazda istenen fatura planını sunmuyor. 12 aylık taahhüt planı için iOS 26.4 veya üzeri ve Xcode 26.5 veya üzeriyle oluşturulmuş bir uygulama gereklidir. |
Ağ hataları
| Hata | Kod | Çözüm |
|---|---|---|
| notActivated | 2002 | Adapty SDK etkinleştirilmemiş. Çoğunlukla bir splash ekranı veya erken bir UI hook’u, Adapty.activate tamamlanmadan önce Adapty metodlarını çağırdığında görülür. Bu belirti aralıklı olarak ortaya çıkar ve simülatörde yeniden üretilemeyebilir; çünkü gerçek cihaz zamanlaması farklıdır. Başka herhangi bir SDK çağrısı planlamadan önce activate’in tamamlanma işleyicisini veya async sonucunu bekleyin. Tam sıra için iOS SDK’da çağrı sırası sayfasına bakın. |
| badRequest | 2003 | Hatalı istek. getPaywall kullanımında bu genellikle istenen placement’ın API anahtarınızın ait olduğu uygulamada bulunmadığı anlamına gelir. Placement ID’nin eksiksiz kopyalandığını ve API anahtarı ile placement’ın Adapty Kontrol Paneli’nde aynı uygulamaya ait olduğunu doğrulayın. |
| serverError | 2004 | Sunucu hatası. Bir süre sonra tekrar deneyin. Sorun çözülmezse Adapty destek ekibiyle iletişime geçin. Bu kod aynı zamanda kısıtlamayı (throttling) da kapsar: aynı endpoint’i çok sık çağırırsanız (örneğin sık profil güncellemeleri), sunucu 429 yanıtı döner ve SDK o endpoint’i yeniden deneme süresi geçene kadar engeller. |
| networkFailed | 2005 | Bu hata, kullanıcının cihazındaki ağ bağlantısıyla ilgili sorunları gösterir. VPN’i devre dışı bırakmayı veya mobil ağdan WiFi’ye ya da tam tersine geçmeyi deneyin. |
| decodingFailed | 2006 | Bu hata, yanıt kod çözümünün başarısız olduğunu gösterir; SDK, ayrıştıramadığı veriler aldı. SDK yerel bir yedek dosyası yüklerken oluşuyorsa dosya, SDK’nın beklediğinden daha eski demektir: Placements sayfasından güncel bir dosya indirin. Yedek sürüm uyuşmazlığı, 3001 hatası olarak da ortaya çıkabilir. |
| encodingFailed | 2009 | Bu hata, istek kodlamasının başarısız olduğunu gösterir. |
Genel Hatalar
| Hata | Kod | Çözüm |
|---|---|---|
| analyticsDisabled | 3000 | Devre dışı bıraktığınız için analytics etkinliklerini işleyemiyoruz. |
| wrongParam | 3001 | Bu hata, bazı parametrelerinizin doğru olmadığını gösterir. Eski Paywall Builder’ı kullanıyorsanız ve bu hata nedeniyle paywall görüntüleyemiyorsanız, o builder’da Show on device seçeneğini etkinleştirin. Bu sorunun bir diğer olası nedeni, yerel yedek dosyasının sürümünün SDK sürümüyle eşleşmemesidir. Kontrol panelinden yeni bir dosya indirin. |
| activateOnceError | 3005 | .activate metodunu birden fazla kez çağırmak mümkün değildir. |
| profileWasChanged | 3006 | İşlem sırasında kullanıcı profili değiştirildi. Bu durum, Adapty.identify hâlâ çalışırken bir metot çağrıldığında yaşanır — devam eden çağrı, değiştirilmek üzere olan bir profile denk gelir ve SDK bunu reddeder. Herhangi bir kullanıcı işlemi çağrısından önce daima identify’ı await edin (ya da tamamlama işleyicisini kullanın). Bkz. iOS SDK’da çağrı sırası. |
| unsupportedData | 3007 | Bu hata, veri formatının SDK tarafından desteklenmediğini gösterir. |
| unidentifiedUserLogout | 3020 | Tanımlanmamış bir kullanıcı için logout metodunu çağırmak mümkün değildir. |
| fetchTimeoutError | 3101 | Bu hata, fetch işleminin zaman aşımına uğradığını gösterir. |
| operationInProgress | 3201 | Aynı türden başka bir işlem hâlâ devam ediyor. Önceki bir çağrı App Store mesajlarını göstermeye devam ederken showStoreMessages çağrıldığında bu hata döner. Bitmesini bekleyin, ardından tekrar deneyin. |
| resolverFailure | 3202 | SDK, işlemin ihtiyaç duyduğu kaynağı bulamadı. UIKit’in showStoreMessages metodunda bir window scene geçmediğinizde ve ön planda aktif bir sahne mevcut olmadığında bu hata döner. Sahneyi açıkça geçin ya da uygulama ön plandayken metodu tekrar çağırın. |
| operationInterrupted | 9000 | Bu işlem sistem tarafından kesintiye uğratıldı. |
updateProfile sonrasında yavaş fetchler
updateProfile ile özel nitelikler ayarlayıp aynı oturumda bir placement fetch edersen, SDK, henüz yayılmayı tamamlamamış niteliklere dayanarak placement’ın segment hash’ini hesaplayabilir. Segment hash yenilendiğinde bir kez daha dener; bu nedenle belirti bir hata değil, daha yavaş bir fetch olarak ortaya çıkar. Fetch yalnızca yeniden deneme de uyuşmazsa başarısız olur; bu da nitelik yazma işleminin henüz tamamlanmadığı anlamına gelir.
Yeniden denemeden kaçınmak için fetch etmeden önce updateProfile’ın tamamlanmasını bekle. Bkz. iOS SDK’da çağrı sırası.
Diğer Sorunlar
Henüz bir çözüm bulamadıysanız, sonraki adımlar şunlar olabilir:
- SDK’yı en son sürüme yükseltme: En son SDK sürümleri daha kararlıdır ve bilinen sorunlara yönelik düzeltmeler içerdiğinden her zaman güncellemenizi öneririz.
- Destek ekibiyle iletişime geçin veya diğer geliştiricilerden yardım alın destek forumunda.
- Destek ekibiyle support@adapty.io adresinden veya sohbet üzerinden iletişime geçin: SDK’yı yükseltmeye hazır değilseniz veya yükseltme sorunu çözmediyse destek ekibimize başvurun. Ayrıntılı kayıt tutmayı etkinleştirirseniz ve günlükleri ekiple paylaşırsanız sorununuz daha hızlı çözülecektir. İlgili kod parçacıklarını da ekleyebilirsiniz.