En gros, j'ai essayé de configurer les achats d'applications sur une application de test avant de les implémenter dans une application appropriée sur laquelle ma société travaille. J'ai lu le fichier pdf du kit Store et d'autres extraits environ 1 000 fois, mais les produits sont toujours retournés vides. Voici exactement ce que j'ai fait jusqu'à présent:
Configurer l'application de test et les éléments de test d'achat via l'application
J'ai créé un nouvel identifiant d'application pour «Test App One» sur le portail de développement de mon entreprise dans le Centre de développement pour iPhone. Je me suis assuré que le préfixe était com.mycompany.testappone
pour que les achats intégrés puissent être configurés. En restant dans la section ID de l'application, j'ai configuré les achats intégrés en cochant l'option "Activer l'achat intégré".
J'ai créé "Test App One" dans iTunes Connect et complété la procédure habituelle, mais j'ai sélectionné "Télécharger le binaire plus tard" et je ne l'ai pas soumis à révision car l'application ne fait rien. Nous n’avons sûrement pas besoin de soumettre l’application pour qu’elle passe en revue?! J'ai ensuite cliqué sur gérer les achats intégrés et en ai créé un avec l'identifiant de produit 'test1' et je l'ai approuvé pour qu'il soit autorisé à la vente.
Code
J'ai mis en place un nouveau projet dans XCode appelé TestAppOne
et voici les 2 seules classes que j'utilise pour l'instant:
TestAppOneAppDelegate.h:
#import <UIKit/UIKit.h>
#import <StoreKit/StoreKit.h>
@interface TestAppOneAppDelegate : NSObject <UIApplicationDelegate, SKRequestDelegate, SKProductsRequestDelegate> {
UIWindow *window;
}
TestAppOneDelegate.m:
#import "TestAppOneAppDelegate.h"
static NSString *kMyFeatureIdentifier1 = @"com.mycompany.testappone.test1";
@implementation TestAppOneAppDelegate
@synthesize window;
- (void)applicationDidFinishLaunching:(UIApplication *)application {
if([SKPaymentQueue canMakePayments]) {
NSLog(@"IN-APP:can make payments");
}
else {
NSLog(@"IN-APP:can't make payments");
}
[self requestProductData];
[window makeKeyAndVisible];
}
- (void)requestProductData {
NSLog(@"IN-APP:requestProductData");
SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers: [NSSet setWithObject:kMyFeatureIdentifier1]];
request.delegate = self;
[request start];
NSLog(@"IN-APP:requestProductData END");
}
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
NSLog(@"IN-APP:productsRequest");
NSArray *myProduct = response.products;
NSLog(@"IN-APP:array count: %i", [myProduct count]);
[request autorelease];
NSLog(@"IN-APP:productsRequest END");
}
- (void)dealloc {
[window release];
[super dealloc];
}
@end
Test sur l'appareil
J'ai créé un compte de test sandbox et me suis déconnecté de mon compte iTunes sur l'iPhone, mais je ne me suis pas connecté au compte de test, car la documentation indique de ne pas le faire jusqu'à ce que nous en soyons informés lors de l'achat. Je construis ensuite l'application et voici le journal que je reçois:
IN-APP:can make payments
IN-APP:requestProductData
IN-APP:requestProductData END
IN-APP:productsRequest
IN-APP:array count: 0
IN-APP:productsRequest END
Est-ce que quelqu'un peut me dire s'il me manque des étapes ou si je fais quelque chose de mal? Malheureusement, il ne semble pas y avoir d'exemples d'applications créées par Apple.
En fait, je pense que vous devez soumettre le binaire pour que cela fonctionne.
Vous pouvez définir la date de sortie dans un avenir lointain.
Une autre étape importante qui est souvent négligée est de vous assurer que vous avez une configuration de contrat d'applications payées iOS qui se trouve dans la section «Contrats, taxe et opérations bancaires» de iTunes connect. Tout d'abord, vous devez cliquer sur le bouton de demande, puis sur les 3 boutons Configurer (informations de contact, informations bancaires, informations fiscales).
Vérifiez s'il existe des identifiants de produit non valides.
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
for (NSString *invalidProductId in response.invalidProductIdentifiers)
{
NSLog(@"Invalid product id: %@" , invalidProductId);
}
}
S'il existe des identifiants de produit non valides, visitez http://troybrant.net/blog/2010/01/invalid-product-ids/
C'est une liste de contrôle très complète pour ce problème.
Vérifiez si votre identifiant d’ensemble (par exemple, com.company.appname) dans XCode correspond à celui d’iTunes Connect.
Vous n'avez pas besoin de soumettre le binaire pour que cela fonctionne.
Supprimez simplement l'application sur votre appareil et redémarrez-la à partir de XCode. Le problème a été résolu pour moi.
Plus besoin de télécharger le fichier binaire, ni d'attendre des heures après la création de l'achat intégré dans iTunes Connect.
Grâce à la réponse de alpere, j'ai découvert que j'avais utilisé le mauvais identifiant de produit. C'était pas comme je le pensais de.company.appname.PROFESSIONAL_LICENSE
. Simplement utiliser PROFESSIONAL_LICENSE
dans mon cas (sans trucs id id bundle) fonctionne :)
Pas besoin de télécharger du binaire pour tester Sandbox InAppPurchase. Vous devez simplement ajouter un élément InAppPurchase dans iTunesConnect et le mettre dans l'état "Prêt à soumettre" (doit) uniquement. Si vous le soumettez pour examen, il restera toujours votre réponse.product vide.
Essayez d'ajouter un produit d'abonnement gratuit. Si cela apparaît sur la réponse, il n'y a rien de mal dans votre code. Étant donné que l'abonnement gratuit est le seul type à ne pas nécessiter d'accords, d'impôts et de services bancaires, s'il apparaît et que les autres types ne le font pas, il s'agit d'un problème lié à votre contrat.
Dans mon cas, la raison en était l'hébergement de contenu par Apple activé par erreur. Le produit était disponible seulement quand je l'ai éteint
Dans mon cas (MacOS), je créais une application de test (avec le même ID d'ensemble de l'application principale). SKFetchRequest a commencé à renvoyer les ID de produit pour l'application de test uniquement après avoir défini le nom du paquet (nom binaire) comme dans l'application d'origine.