44 votes

Bouton de restauration des achats dans les applications

J'ai implémenté les achats in app dans la mise à jour de mon application pour la première fois, mais j'ai attendu 3 semaines avant de voir mon application rejetée pour la raison suivante :

Nous avons constaté que votre application propose des achats en ligne qui peuvent être restaurés. mais elle n'inclut pas de fonction "Restaurer" pour permettre aux utilisateurs de restaurer les Achats In-App précédemment achetés. Pour restaurer des produits achetés, il serait approprié de fournir un bouton "Restaurer". bouton "Restore" et de lancer le processus de restauration lorsque le bouton "Restore" est est appuyé sur ce bouton.

Maintenant, je pensais ajouter un navbar à la droite (en haut) de mon tableau où les achats d'applications peuvent être vus/touchés et ajouter le code suivant qui sera lié au bouton :

 [[SKPaymentQueue defaultQueue]   restoreCompletedTransactions];

Quelqu'un peut-il vérifier que c'est correct et que c'est probablement tout ce qui est nécessaire ? J'aimerais que cela passe avec succès cette fois-ci. Merci d'avance !

7 votes

J'ai eu le même foutu avis de rejet. Est-ce que vous fournissez toujours un bouton "restaurer" ? !?! Je veux vérifier automatiquement si des achats in-app ont été restaurés, mais lorsque j'appelle la fonction restoreCompletedTransactions, l'utilisateur est invité à saisir un mot de passe. Ça craint ! Existe-t-il une autre API pour cela ? Est-ce que je peux simplement changer mon bouton "BUY" en "BUY/RESTORE" ??? Ce qui craint toujours autant. Je n'ai pas de place pour un bouton "RESTORE" à plein temps.

1 votes

@whatchamacallit Tout ce que j'ai fait, c'est mettre le code suivant du dessus dans une méthode connectée à un bouton de la barre de navigation et il a été approuvé. Si vous n'avez pas de place pour le bouton dans la barre de navigation, vous devez probablement le placer dans la vue elle-même... peut-être dans le tableau ou au-dessus du tableau. Bonne chance !

5 votes

Je ne vois pas de bouton de restauration sur Angry Birds for Mighty Eagle ? Pourquoi n'est-il pas rejeté ?

43voto

Brian Noah Points 1312

J'utilise une variation de ceci :

//inside of an IBaction
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue]restoreCompletedTransactions];

// Then this is called
- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue {
    NSLog(@"%@",queue );
    NSLog(@"Restored Transactions are once again in Queue for purchasing %@",[queue transactions]);  

    NSMutableArray *purchasedItemIDs = [[NSMutableArray alloc] init];
    NSLog(@"received restored transactions: %i", queue.transactions.count);

    for (SKPaymentTransaction *transaction in queue.transactions) {
        NSString *productID = transaction.payment.productIdentifier;
        [purchasedItemIDs addObject:productID];
        NSLog (@"product id is %@" , productID);
        // here put an if/then statement to write files based on previously purchased items
        // example if ([productID isEqualToString: @"youruniqueproductidentifier]){write files} else { nslog sorry}
    }  
}

Désolé, je suis sur mon iPad si cela n'a aucun sens.

8 votes

[[SKPaymentQueueue defaultQueue] addTransactionObserver:self] ; a résolu mon problème ! Merci ! Beaucoup d'autres exemples négligent cette ligne.

2 votes

Ce n'est pas exact. Après avoir appelé restoreCompletedTransations, la méthode déléguée qui sera appelée est -(void)paymentQueue :(SKPaymentQueue *)queue updatedTransactions :(NSArray *)transactions

0 votes

Ce n'est peut-être pas exact pour vous, mais cela fonctionne étonnamment bien pour moi. hmmm.

28voto

Nikita Pestrov Points 3778

Alex, j'ai été rejeté pour la même raison la semaine dernière, et c'est exactement ce que voulait Apple - après avoir ajouté une telle Restaurer bouton ils n'ont pas posé d'autre question sur ce sujet.

Bien sûr, vous ne devez pas seulement appeler [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; mais aussi de mettre en œuvre la restauration elle-même (c'est-à-dire de fournir le contenu à l'utilisateur).

0 votes

Merci pour la réponse Nikita. C'est en effet très frustrant. En gros, ce que j'ai fait avec mes achats in-app, c'est qu'une fois que l'utilisateur a effectué un achat, il est placé dans un tableau d'achats pour cet ID de produit. Lorsqu'il touche une vue qui offre l'achat in-app, la vue vérifie si l'utilisateur est dans le tableau d'achats et, en fonction de cela, redirige automatiquement vers la vue d'achat ou vers une vue de publicité. Pouvez-vous me dire ce qui se passe exactement lorsque la fonction restoreCompletedTranscations est appelée ? Merci

0 votes

RestoreCompletedTranscations vous donnera une transaction restaurée à votre délégué SKPaymentObserver, ainsi vous serez capable de voir ce que l'utilisateur a acheté auparavant. Les transactions sont simplement SKPaymentTransactions, et leur état est SKPaymentTransactionStateRestored.

2 votes

Comment obtenir le détail de la dernière transaction ou restaurer la dernière transaction complète ? La méthode ci-dessus me donne beaucoup d'identifiants mais pas le dernier identifiant d'achat.

4voto

Jojodmo Points 4155

En effet, vous pouvez être connecté avec le même identifiant Apple sur différents appareils iOS.

Par exemple, disons que je suis connecté à test@iCloud.com sur un iPad. Lorsque je télécharge votre application, je me rends compte que j'aimerais supprimer les publicités, alors je paie 99 ¢ pour les supprimer.

Un an plus tard, je décide d'acheter un iPhone, je me connecte à test@iCloud.com sur ce compte et je télécharge à nouveau votre application. Cependant, les publicités sont toujours là, alors que j'ai déjà payé pour les supprimer sur mon iPad. C'est là que le rétablir La fonctionnalité entre en jeu. Grâce à elle, je peux restaurer les achats que j'ai effectués sur mon iPad et les faire fonctionner sur mon iPhone.

Pour rétablir l'achat, vous pourriez utiliser :

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];

Cela entraîne le

(void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentQueue *)queue

à appeler. À l'intérieur de cette méthode, vous devez fournir à l'utilisateur le contenu qu'il a acheté.

3voto

Roman B. Points 458

L'alternative au bouton de restauration pourrait être un interrupteur de restauration dans le système d'information. paquet de paramètres d'application . Elle ne surcharge pas l'interface utilisateur et semble être bien accueillie par Apple (mais veillez à mentionner que vous avez mis en œuvre des mécanismes de cette manière).

BOOL shouldRestorePurchases = [[NSUserDefaults standardUserDefaults] boolForKey:@"restorePurchasesKey"];

0 votes

@AbdulYasin la méthode décrite propose de stocker un booléen dans le bundle des paramètres. Dans l'application, vous devez implémenter la logique comme vous le feriez avec le "bouton de restauration".

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