4 votes

RevenueCat - Pourquoi est-ce que je reçois : Error Domain=SKErrorDomain Code=2 "Impossible de se connecter à l'iTunes Store"

J'ai deux abonnements à renouvellement automatique, mensuel et annuel (iOS). Je peux effectuer un achat lorsque j'utilise un nouvel utilisateur du bac à sable. Cependant, je dois entrer mon mot de passe trois fois. Voici comment cela se passe :

  1. Tapez sur un abonnement
  2. Saisir le mot de passe
  3. Invitation à saisir à nouveau le mot de passe
  4. obtenir l'erreur "cannot connect to iTunes Store" (Impossible de se connecter à l'iTunes Store)
  5. essayez à nouveau et entrez le mot de passe
  6. l'achat réussit.

Si l'opération réussit, je suis maintenant abonné et mon interface utilisateur est mise à jour via un listener dans appDelegate qui envoie une notification à laquelle je m'abonne. Mais lorsque j'essaie de passer d'un abonnement mensuel à un abonnement annuel, ou vice versa, je reçois toujours l'erreur "Cannot connect to iTunes Store". Pas de mise à jour de l'interface utilisateur. Voici le flux :

  1. Tapez sur l'autre abonnement
  2. Invitation à saisir le mot de passe iTunes
  3. Recevoir la boîte de dialogue "confirmer l'achat" qui indique que je modifie mon abonnement
  4. Tapez sur continuer
  5. Recevoir l'alerte "Vous êtes prêt".
  6. Annuler l'alerte
  7. Recevoir l'erreur "Cannot connect to iTunes Store" (Impossible de se connecter à l'iTunes Store)
  8. Mon auditeur n'a pas été appelé, l'interface utilisateur n'a pas été mise à jour, etc.

Mais si je rejette l'erreur et que j'appuie à nouveau sur l'abonnement, je reçois une alerte indiquant que je suis déjà abonné à ce plan, bien que l'erreur ait été déclenchée et que mon auditeur n'ait pas pris en compte le changement.

J'utilise firebase. J'ai suivi le quickstart et les instructions spécifiques à Firebase dans les docs de RevenueCat. Tous mes journaux de débogage semblent être corrects, pas de statut non-200, pas d'identifiant de produit invalide. Voici quelques extraits de code :

AppDelegate :

Purchases.debugLogsEnabled = true
Purchases.configure(withAPIKey: Constants.revenueCatKey)
Purchases.shared.delegate = self

FirebaseApp.configure()

authHandle = Auth.auth().addStateDidChangeListener() { (auth, user) in

        if let uid = user?.uid {

            Purchases.shared.identify(uid, { (info, error) in
                if let e = error {
                    print("sign in error: \(e.localizedDescription)")
                } else {
                    print("User \(uid) signed in")
                }
            })
          }
            ...
        }
    }

extension AppDelegate: PurchasesDelegate {

    func purchases(_ purchases: Purchases, didReceiveUpdated purchaserInfo: PurchaserInfo) {

        if self.currentUser != nil {

            if purchaserInfo.activeSubscriptions.contains(Constants.audiomeshSubscriptions.monthly) {
                guard let myRef = DataService.instance.REF_PRIVATE else { return }
                myRef.updateData(["plan" : "paidMonthly"]) { err in
                    if let err = err {
                        print("error updating user-private with new subscription: \(err)")
                    } else {

                        NotificationCenter.default.post(name: Notification.Name(rawValue: "purchaserInfoUpdated"), object: nil)
                    }
                }

            }
            else if purchaserInfo.activeSubscriptions.contains(Constants.audiomeshSubscriptions.yearly) {
                //do the same for yearly subscription

            }
            else {
                 //handle non-paying users here
            }
        } 
    }
}

UpgradeController (l'interface utilisateur pour les achats) :

@objc func purchaseButtonSelected(sender: AudiomeshButton) {
    let buttonTag = sender.tag
    guard let option = options?[buttonTag] else { return }

    let product:SKProduct = option.product

    Purchases.shared.makePurchase(product, { (transaction, purchaserInfo, error) in

        if let error = error {
            print("error making purchase: \(error)")

        } else {
                print("Purchase Successful")
        }
    })
}

9voto

Jacob Eiting Points 714

Il est donc relativement facile de répondre à cette question, mais la réponse est plutôt insatisfaisante.

Les upgrades et les crossgrades ne fonctionnent pas dans l'Environnement de travail.

Cette erreur est presque toujours renvoyée dans ce cas. La bonne nouvelle, c'est que cela fonctionne en production et en RevenuCat suit correctement tous les cas.

5voto

enc_life Points 664

C'est donc le message générique NSError qui est envoyé pour toutes les SKErrors. Le code d'erreur 2 est "paiement annulé". Cependant, c'est également l'erreur qui se produit lorsque vous êtes déjà abonné à un élément.

Êtes-vous sûr d'avoir laissé l'abonnement annuel expirer avant d'essayer de vous réabonner ? Les abonnements annuels se renouvellent toutes les heures, 6 fois, avant d'expirer.

Pour voir la SKError spécifique, vous ferez quelque chose comme :

if let error = error as? SKError  {
                print("SKError - ")
                switch error.code {  // https://developer.apple.com/reference/storekit/skerror.code
                case .unknown:
                    print("unknown error")
                case .paymentCancelled:
                    print("cancelled error")
                case .clientInvalid:
                    print("client invalid")
                case .paymentInvalid:
                    print("payment invalid")
                case .paymentNotAllowed:
                    print("payment not allowed")
                case .cloudServiceNetworkConnectionFailed:
                    print("cloud service network connection failed")
                case .cloudServicePermissionDenied:
                    print("cloud service permission denied")
                case .storeProductNotAvailable:
                    print("store product not available")
                case .cloudServiceRevoked:
                    print("cloud service revoked")
                }
            }

Une fois que vous connaissez la SKError renvoyée, je peux mettre à jour ma réponse si nécessaire avec plus d'informations sur ce qui peut se passer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X