web-dev-qa-db-fra.com

Effacer les achats de IOS sandbox d'achat in-app pour un utilisateur de test

Quelqu'un a-t-il des idées sur la façon de réinitialiser et/ou d'effacer le sandbox IOS d'achat intégré à l'application? J'ai une application que je teste avec le sandbox, et j'aimerais tester de nouveaux achats sans avoir à créer un nouvel utilisateur de test chaque fois que j'achète quelque chose. Si je ne le fais pas, alors (bien sûr) je reçois toujours un message indiquant que l'article d'achat intégré a déjà été acheté lorsque je clique sur mon bouton d'achat de l'application.

106
RandomIOSDeveloper

OMI, il y a 3 choses que vous pouvez faire pour rendre les tests de non-consommables supportables:

  1. Vous pouvez avoir plusieurs comptes de test associés à un e-mail. Gmail, par exemple, vous permet d'ajouter une chaîne "plus" à l'e-mail pour créer des alias pour une adresse : so [email protected] et [email protected] les deux vont vraiment à [email protected]. D'autres hôtes de messagerie font probablement de même. Lorsque vous créez un compte de test, vous devez introduire: prénom, nom, adresse e-mail, mot de passe, question secrète, réponse secrète, date de naissance et pays du magasin iTunes. Vous pouvez mettre exactement les mêmes données (y compris le mot de passe) pour [email protected] et [email protected] et vous aurez deux comptes de test. Enfin, dans votre [email protected] boîte de réception, vous recevrez deux e-mails de vérification de Apple pour confirmer les deux comptes de test.

  2. Supposons que vous avez un non-consommable avec l'ID de produit @ "Extra_Levels". Au lieu d'écrire @ "Extra_Levels" dans toutes les méthodes (requestProduct, PurchaseProduct, ...), écrivez simplement PRODUCT_ID1 et dans un fichier d'en-tête, mettez #define PRODUCT_ID1 @"Extra_Levels" (sans point-virgule!), le préprocesseur recherchera PRODUCT_ID1 et le remplacera par @ "Extra_Levels". Ensuite, créer un nouveau non consommable appelé @ "Extra_Levels_01" et changer le #define reviendra à réinitialiser les achats pour tous vos utilisateurs de test.

  3. Comme l'a souligné Appsmatics, vous pouvez tester le comportement correct de votre code lorsque vous achetez un IAP non consommable en utilisant d'abord un IAP consommable (afin que l'utilisateur de test puisse faire autant d'achats que nécessaire) pour se débarrasser de certains bugs. Bien sûr, vous devriez également tester le code avec le vrai IAP non consommable après cela.

69
Roberto Canogar

Pour autant que je sache, vous ne pouvez pas faire cela. Le backend sandbox fonctionne comme un compte réel - une fois acheté, il est acheté (et vous pouvez donc tester la restauration). Vous devriez faire la majeure partie de votre développement avec les trucs du magasin, puis lorsque vous pourrez le tester pour de vrai, attendez-vous simplement à créer plusieurs comptes de test.

31
Ben Zotto

J'ai 2 articles d'achat intégrés. 1 pour la production. et l'autre pour les tests. quand je dois "effacer" je supprime l'élément dans l'application et j'en crée un nouveau (15 secondes dans iTunes connect et 1 seconde pour changer l'identifiant du produit dans le code)

si je n'ai pas besoin de tester "nouvel utilisateur", j'utilise la production dans l'élément d'application.

7
user1105951

Eh bien, techniquement, vous n'en avez pas besoin.

Si vous obtenez SKPaymentTransactionStateRestored, cela équivaut à 100% au fait que l'App Store vérifie l'utilisateur et lui accorde l'achat. J'ai un interrupteur comme:

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
  for( SKPaymentTransaction *purch in transactions )
  {
    switch( purch.transactionState )
    {
      case SKPaymentTransactionStateRestored:
        info( "PURCHASE RESTORE" ) ;
        // fall thru
      case SKPaymentTransactionStatePurchased:
        [[SKPaymentQueue defaultQueue] finishTransaction:purch];
        // Do regular changes to app state for this purchase,
        // register in keychain, etc.
        break ;

       //.. other cases
     }
  }
}

La question d'avoir la logique de votre application/reprendre l'achat est simple: si vous mettez en cache les achats dans le trousseau, supprimez votre trousseau. Si vous le faites d'une autre manière, changez simplement l'état de votre application locale pour prétendre que l'utilisateur ne l'a jamais achetée auparavant. La boîte de dialogue de demande d'achat est toujours la même, la seule différence est que lorsque vous tapez OUI, elle vous donne SKPaymentTransactionStateRestored au lieu de SKPaymentTransactionStatePurchased.

6
bobobobo

La suppression de votre application et sa réinstallation fonctionnent également pour les tests sandbox. Cela dépend évidemment de l'application, mais je teste une application basée sur un abonnement qui n'achète que lors de l'inscription pour le moment, donc c'est la solution la plus simple.

4
Christopher Larsen

Découvrez SimStoreKit . Il s'agit d'une "version simulée du StoreKit de l'iPhone, pour tester les interfaces utilisateur des magasins sur le simulateur iPhone, ou même sur l'appareil sans avoir à configurer IAP dans Connect".

SimStoreKit stocke les achats dans les valeurs par défaut de l'utilisateur sous la clé ILSimSKTransactions. Donc, pour effacer tous les achats que vous pouvez faire:

[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"ILSimSKTransactions"]

Sur le simulateur, vous pouvez simplement supprimer votre application et la réinstaller.

J'ai utilisé avec succès SimStoreKit pour déboguer la vitrine de mon application avant de tester avec le sandbox. La beauté de cette bibliothèque est qu'elle peut être configurée pour utiliser les mêmes noms de classe que le véritable framework StoreKit (en faisant #define ILSimReplaceRealStoreKit 1 avant de faire #include <ILSimStoreKit.h>).

Dans les fichiers source où j'ai besoin d'accéder à StoreKit, j'inclus ce fichier d'en-tête:

#import <TargetConditionals.h>

#if TARGET_IPHONE_SIMULATOR
    #define kILSimAllowSimulatedStoreKit 1
    #define ILSimReplaceRealStoreKit 1
    #import <ILSimStoreKit.h>
#else
    #import <StoreKit/StoreKit.h>
#endif

Cela a pour effet d'utiliser SimStoreKit lorsque je cours sur le simulateur et le vrai StoreKit lorsque je cours sur l'appareil.

3
Emile Cormier

Pas vraiment une réponse, mais aide à expliquer.

Je pensais que puisque le fichier devait être téléchargé, il était possible qu'il puisse être supprimé. La fonction simple ci-dessous essaie cela (Swift 3.0):

func removeReceipt() {
    if let receiptURL = Bundle.main.appStoreReceiptURL {
        print("receipt URL: \(receiptURL)")
        do {
            try FileManager.default.removeItem(at: receiptURL)
            print("Success")
        } catch let error as NSError {
            print("ERROR: \(error.localizedDescription)")
        }
    }
}

Vous avez la réponse suivante:

uRL de réception: fichier: /// private/var/mobile/Containers/Data/Application/7A2-App-Related-Number-67/StoreKit/sandboxReceipt

ERREUR: "sandboxReceipt" n'a pas pu être supprimé car vous n'êtes pas autorisé à y accéder.

Bien que le code montre qu'il extrait le reçu du bundle d'application, il avait en quelque sorte pensé que le bundle était statique, et donc le reçu pouvait toujours être supprimé. Je suis sûr qu'il y a des raisons de sécurité pour lesquelles tout cela fonctionne de cette façon - nous avons donc dû supprimer l'application pour (re) tester le cas de passer d'aucun reçu à un nouveau reçu téléchargé.

0
anorskdev

Continuez simplement à utiliser le même compte de test, en restaurant vos achats plutôt qu'en en effectuant de nouveaux. Après tout, que vous commenciez un nouvel achat ou que vous en restauriez un ancien, VOTRE APP fera la même chose (au moins initialement, peut-être que l'interface utilisateur se mettra à jour différemment à la fin). Apple sont les gens qui gèrent les choses différemment dans ces différentes situations - ne vous en faites pas.

Placez votre logique de livraison dans le cas SKPaymentTransactionStateRestored dans l'implémentation de cette méthode pour les tests:

- (void)paymentQueue:(SKPaymentQueue *)queue
 updatedTransactions:(NSArray *)transactions;

Assurez-vous ensuite de mettre cette logique de livraison dans le cas SKPaymentTransactionStatePurchased.

À la fin, parce que la plupart d'entre nous sont obsessionnels-compulsifs à des degrés divers, faites un test final avec un nouveau compte (ce n'est pas grave pour en faire un deuxième pour une certitude absolue).

La dernière chose à noter: considérez la position d'Apple. S'il y avait un problème avec les développeurs devant perdre du temps à créer des dizaines ou des centaines de comptes pour tester complètement IAP, ils auraient résolu le problème. Il n'y a pas de problème.

0
ArthurVonBabylon