Gérer les erreurs dans le SDK iOS
Le SDK Adapty dispose de son propre wrapper pour tous les types d’erreurs, appelé AdaptyError. En pratique, toute erreur retournée par un SDK est une AdaptyError. Elle possède deux propriétés utiles : originalError et adaptyErrorCode, décrites ci-dessous.
originalError contient l’erreur d’origine au cas où vous en auriez besoin. Il peut s’agir d’une SKError, d’une NSError ou d’une Error Swift générique. Cette propriété est optionnelle, car certaines erreurs peuvent être générées directement par le SDK — par exemple en cas de données incohérentes ou manquantes — et n’auront pas d’erreur d’origine autour de laquelle le wrapper a été construit.
adaptyErrorCode peut être utilisé pour gérer les problèmes courants, comme :
- identifiants invalides
- erreurs réseau
- paiements annulés
- problèmes de facturation
- reçu invalide
- et bien plus encore
Il est assez facile de vérifier le code d’erreur et d’y réagir en conséquence.
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
}
}
Activez les logs verbeux avant de déboguer. La plupart des AdaptyErrors encapsulent une erreur StoreKit, réseau ou backend sous-jacente. Avec les logs verbeux activés (Adapty.logLevel = .verbose — voir Logging), cette erreur encapsulée est affichée dans la console, ce qui révèle généralement la cause réelle. La propriété originalError est renseignée quel que soit le niveau de log — les logs verbeux la font simplement apparaître dans la console.
Si ces solutions ne résolvent pas votre problème, consultez Autres problèmes pour connaître les étapes à suivre avant de contacter le support afin de nous aider à vous assister plus efficacement.
Erreurs StoreKit
| Erreur | Code | Solution |
|---|---|---|
| unknown | 0 | Code d’erreur indiquant qu’une erreur inconnue ou inattendue s’est produite. Réessayez ou consultez la section Autres problèmes. |
| clientInvalid | 1 | Ce code d’erreur indique que le client n’est pas autorisé à effectuer l’action tentée. |
| paymentCancelled | 2 | Ce code d’erreur indique que l’utilisateur a annulé une demande de paiement. Aucune action n’est requise, mais d’un point de vue métier, vous pouvez proposer une remise à l’utilisateur ou lui rappeler l’offre plus tard. |
| paymentInvalid | 3 | Cette erreur indique que l’un des paramètres de paiement n’a pas été reconnu par l’App Store. |
| paymentNotAllowed | 4 | Ce code d’erreur indique que l’utilisateur n’est pas autorisé à valider des paiements. |
| storeProductNotAvailable | 5 | Ce code d’erreur indique que le produit demandé n’est pas disponible dans le store. Essayez de réinstaller l’application. |
| cloudServicePermissionDenied | 6 | Ce code d’erreur indique que l’utilisateur n’a pas autorisé l’accès aux informations du service Cloud. |
| cloudServiceNetworkConnectionFailed | 7 | Ce code d’erreur indique que l’appareil n’a pas pu se connecter au réseau. |
| cloudServiceRevoked | 8 | Ce code d’erreur indique que l’utilisateur a révoqué l’autorisation d’utiliser ce service Cloud. |
| privacyAcknowledgementRequired | 9 | Ce code d’erreur indique que l’utilisateur n’a pas encore accepté la politique de confidentialité d’Apple. |
| unauthorizedRequestData | 10 | Ce code d’erreur indique que l’application tente d’utiliser une propriété pour laquelle elle ne dispose pas des droits requis. |
| invalidOfferIdentifier | 11 | L’ Assurez-vous de configurer les offres souhaitées dans App Store Connect et de transmettre un identifiant d’offre valide. |
| invalidSignature | 12 | Ce code d’erreur indique que la signature dans une remise de paiement n’est pas valide. |
| missingOfferParams | 13 | Ce code d’erreur indique que des paramètres sont manquants dans une remise de paiement. |
| invalidOfferPrice | 14 | Ce code d’erreur indique que le prix que vous avez spécifié dans App Store Connect n’est plus valide. Les offres doivent toujours correspondre à un prix réduit. |
| noProductIDsFound | 1000 | Cette erreur indique qu’aucun des produits demandés sur le paywall n’est disponible à l’achat dans l’App Store, même s’ils y sont répertoriés. Elle peut parfois s’accompagner d’un avertissement Si vous rencontrez cette erreur, suivez les étapes décrites dans la section Correctif pour l’erreur Code-1000 |
| productRequestFailed | 1002 | Impossible de récupérer les produits disponibles pour le moment. |
| cantMakePayments | 1003 | Les achats intégrés ne sont pas autorisés sur cet appareil. Consultez le guide de dépannage. |
| cantReadReceipt | 1005 | Aucun reçu valide n’est disponible sur l’appareil. Cela peut poser problème lors des tests en sandbox. En sandbox, vous n’aurez pas de fichier de reçu valide tant que vous n’aurez pas effectué un achat — assurez-vous d’en réaliser un avant d’y accéder. Lors des tests en sandbox, vérifiez également que vous êtes connecté sur l’appareil avec un compte sandbox Apple valide. |
| productPurchaseFailed | 1006 | L’achat du produit a échoué. Cette erreur encapsule une erreur StoreKit sous-jacente — lisez originalError (ou activez les logs détaillés pour la voir dans la console) pour en connaître la cause réelle. L’erreur encapsulée correspond généralement à l’un des codes StoreKit 0–14 du tableau ci-dessus — le plus souvent paymentCancelled, paymentInvalid, paymentNotAllowed ou invalidOfferPrice. Si vous ne parvenez pas à identifier une raison précise, essayez un nouveau profil sandbox ; si l’échec persiste, contactez le support Apple. |
| refreshReceiptFailed | 1010 | L’opération d’actualisation du reçu a échoué. |
| fetchSubscriptionStatusFailed | 1020 | Impossible de récupérer le statut de l’abonnement depuis l’App Store. |
| unknownTransactionId | 1030 | L’identifiant de transaction est inconnu. |
| paymentPendingError | 1050 | Le paiement est actuellement en attente. |
Erreurs réseau
| Erreur | Code | Solution |
|---|---|---|
| notActivated | 2002 | Le SDK Adapty n’est pas activé. Se produit le plus souvent quand un écran de démarrage ou un hook UI précoce appelle des méthodes Adapty avant que Adapty.activate ne se termine. Le symptôme est intermittent et peut ne pas se reproduire sur simulateur car le timing diffère sur un appareil réel. Attendez le handler de complétion ou le résultat async d’activate avant de planifier tout autre appel SDK. Consultez Ordre d’appel dans le SDK iOS pour la séquence complète. |
| badRequest | 2003 | Requête incorrecte. Avec getPaywall, cela signifie le plus souvent que le placement demandé n’existe pas dans l’app associée à votre clé API. Vérifiez que l’ID de placement est copié exactement et que la clé API et le placement proviennent de la même app dans l’Adapty Dashboard. |
| serverError | 2004 | Erreur serveur. Réessayez après quelques instants. Si le problème persiste, contactez l’équipe support Adapty. Ce code couvre également le throttling : si vous appelez le même endpoint trop fréquemment (par exemple, des mises à jour de profil répétées), le serveur répond avec un 429 et le SDK bloque cet endpoint jusqu’à l’expiration de l’intervalle de réessai. |
| networkFailed | 2005 | Cette erreur indique des problèmes de connexion réseau sur l’appareil de l’utilisateur. Essayez de désactiver le VPN ou de passer du réseau cellulaire au Wi-Fi, ou inversement. |
| decodingFailed | 2006 | Cette erreur indique que le décodage de la réponse a échoué — le SDK a reçu des données qu’il ne peut pas analyser. Si elle survient lors du chargement d’un fichier de secours local, le fichier est plus ancien que ce qu’attend le SDK : téléchargez un nouveau fichier depuis la page Placements. Un décalage de version du paywall de secours peut également se manifester sous la forme de l’erreur 3001. |
| encodingFailed | 2009 | Cette erreur indique que l’encodage de la requête a échoué. |
Erreurs générales
| Erreur | Code | Solution |
|---|---|---|
| analyticsDisabled | 3000 | Impossible de traiter les événements d’analytics, car vous l’avez désactivé. |
| wrongParam | 3001 | Cette erreur indique que certains de vos paramètres sont incorrects. Si vous utilisez le Paywall Builder d’Adapty et ne pouvez pas afficher un paywall à cause de cette erreur, activez Show on device dans le Paywall Builder. Une autre cause possible est que la version du fichier paywall de secours local ne correspond pas à la version du SDK. Téléchargez un nouveau fichier depuis le tableau de bord. |
| activateOnceError | 3005 | Il n’est pas possible d’appeler la méthode .activate plus d’une fois. |
| profileWasChanged | 3006 | Le profil utilisateur a été modifié pendant l’opération. Cela se produit lorsqu’une méthode est appelée alors que Adapty.identify est encore en cours d’exécution — l’appel en vol atterrit sur un profil qui est sur le point d’être remplacé, et le SDK le rejette. Attendez toujours la résolution d’identify (ou utilisez son handler de complétion) avant tout appel déclenché par une action utilisateur. Voir Ordre d’appel dans le SDK iOS. |
| unsupportedData | 3007 | Cette erreur indique que le format de données n’est pas pris en charge par le SDK. |
| unidentifiedUserLogout | 3020 | Il n’est pas possible d’appeler la méthode logout pour un utilisateur non identifié. |
| fetchTimeoutError | 3101 | Cette erreur indique que l’opération de récupération a expiré. |
| operationInterrupted | 9000 | Cette opération a été interrompue par le système. |
Autres problèmes
Si vous n’avez pas encore trouvé de solution, voici quelques pistes à explorer :
- Mettre à jour le SDK vers la dernière version : nous recommandons toujours de mettre à jour vers les dernières versions du SDK, car elles sont plus stables et incluent des correctifs pour les problèmes connus.
- Contacter l’équipe support ou obtenir de l’aide auprès d’autres développeurs dans le forum de support.
- Contacter l’équipe support via support@adapty.io ou via le chat : si vous n’êtes pas prêt à mettre à jour le SDK ou que cela n’a pas résolu le problème, contactez notre équipe support. Notez que votre problème sera résolu plus rapidement si vous activez la journalisation verbose et partagez les logs avec l’équipe. Vous pouvez également joindre des extraits de code pertinents.