10
votes

Storekit: Catch Restore échoué?

Je suis implémentant une fonctionnalité d'achat in-app avec la touche RESTORE .

J'ai un utilisateur nouvel utilisateur de test configuré, sans aucun paiement effectué.

Lorsque je touche le bouton de restauration et connectez-vous avec le nouvel utilisateur de test, je ne peux pas saisir de méthodes déléguées qui me disent que la transaction de restauration a échoué (car il n'y a rien à restaurer).

La seule méthode qui est invoquée est - (vide) PaiementQuehereCompédTransAgAsActionDtransAgAsAccomportionsFinished: (SKPAYMENTQUE *) File d'attente , mais cette méthode est appelée dans le cas où la restauration a également réussi.

Que puis-je faire maintenant? Comment puis-je attraper un tel cas?


Ajout: J'ai un indicateur de progression indiquant "Contacter l'App Store", et j'ai besoin d'une invocation où je peux aussi le cacher dans des cas ratés.


8 commentaires

Étant donné que le problème n'a pas été acheté par l'utilisateur de test, vous n'obtiendrez pas SKPAYMENTTRANSACTSATATERESTORTED en réponse de l'iTunesConnect, qui finit finalement votre transcation.


C'est clair. Mais j'ai montré un indicateur de progression «Contact App Store», et j'ai toujours besoin d'un événement pour le cacher également sur l'échec.


Il n'y a pas d'échec, quand aucune transaction n'est là pour restaurer. En fait, cette affaire est traitée comme succès.


Ensuite, masquez votre indicateur dans - (vide) PaymentQuEserSuReCompéDatransAssactionnéFinished: (SKP Aymentieue *) Queue Méthode


Ouais, quelque chose de similaire. Je compte la file d'attente.Transactions, puis si son retour zéro, je déléguais une échec.


Oui, c'est ce que je fais aussi maintenant. Merci.


Comment as-tu fais ça? Pourriez-vous mettre votre code? Merci: D


@Geri comment était votre solution? Pourriez-vous le poster sous votre réponse?


3 Réponses :


1
votes

Lorsque vous restaurez une transaction, deux méthodes déléguées:

//
// called when the transaction status is updated
//
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
    for (SKPaymentTransaction *transaction in transactions)
    {
        switch (transaction.transactionState)
        {
            case SKPaymentTransactionStatePurchased:
                [self completeTransaction:transaction];
                break;
            case SKPaymentTransactionStateFailed:
                [self failedTransaction:transaction];
                break;
            case SKPaymentTransactionStateRestored:
                [self restoreTransaction:transaction];
                restoredTransaction++;
                break;
            default:
                break;
        }
    }
}


1 commentaires

Mais comment Geri a-t-il résolu ce problème? Il dit qu'il l'a résolu avec le retour de 0 qui est renvoyé de la NSLOG s'il n'y a pas d'achats effectués auparavant.



0
votes

Vous pouvez utiliser la méthode de délégation suivante pour restaurer la transaction.

 -(void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error{
NSLog(@"Error when purchasing: %@",error);

}


1 commentaires

Ce délégué n'est appelé que si la restauration a été annulée ou une erreur de connexion Internet a été utilisée. Je veux si l'utilisateur n'a pas fait d'achats avant et c'est le problème. Jetez un coup d'œil aux commentaires de la question. Il y a une solutin avec renvoyer une valeur mais je ne sais pas comment.



9
votes

Noah: Voici un extrait de code pour vous: xxx

et la méthode suivante: xxx

laissez-moi savoir si cela vous aide si cela vous aide si cela vous aide si cela vous aide ....


2 commentaires

thx, résolu ... avec cette ligne: D (! Queue.Transactions || [file d'attente.Transactions comptage] == 0)


J'ai toujours trouvé que j'avais besoin de la déclaration d'autre. Mais je me souviens maintenant de quelle situation ... Si un utilisateur a une abonnement qui a expiré et que vous essayez de restaurer, il retournera toujours les achats précédents pour chaque mois que l'utilisateur a été souscrit. C'est pourquoi je vérifie la période. Si "maintenant" ne tombe pas dans aucune des périodes, rien n'a été restauré. Cela pourrait ne pas s'appliquer à votre situation