(iOS + StoreKit) puis-je détecter quand je suis dans le bac à sable?

J'ai des achats in-app qui fonctionnent très bien, et je vais sur la route de validation du serveur. Le serveur a besoin de savoir si je suis dans le bac à sable ou non, donc pour l'instant je lui envoie simplement un paramètre "&sandbox=1". Bien sûr, lorsque la version complète de l'application est sortie, Je ne vais pas envoyer ce paramètre.

Je préfère ne pas avoir ce code en dur dans mon application, car cela rendra les tests difficiles à l'avenir, et c'est une (grande) chose à retenir de changer avant de soumettre des builds Apple.

Y a-t-il un moyen de demander à StoreKit si je suis dans le bac à sable afin que je puisse déterminer si oui ou non je dois envoyer ce paramètre à mon serveur? Alternativement, existe-t-il d'autres meilleures pratiques pour gérer la validation du serveur?

En pensant à cela plus, devrais-je juste que le serveur vérifie toujours le système en direct d'abord, puis le bac à sable? Si les identifiants apple sont séparés entre les systèmes live et sandbox, cela ne ferait aucun mal, n'est-ce pas?

Merci.

21
demandé sur DOOManiac 2012-03-13 05:32:56

3 réponses

Après un peu de creuser, j'ai trouvé cela dans la Note technique TN2259 D'Apple:

Comment puis-je vérifier mon reçu (iOS)?

Vérifiez toujours votre reçu d'abord avec L'URL de production; procédez à la vérification avec l'URL du bac à sable si vous recevez un code d'état 21007. suivre cette approche garantit que vous n'avez pas à basculer entre les URL pendant que votre application est testée ou examinée dans le bac à sable ou est en direct dans L'App Store.

Donc il on dirait que je devrais hacher complètement le paramètre &sandbox et juste le faire. J'ai vraiment dû creuser pour cette réponse, donc je la poste ici dans l'espoir que quelqu'un d'autre la traverse!

63
répondu DOOManiac 2012-03-13 01:54:12

J'ai rencontré le même problème, où mon application a été rejetée parce que la version" production " de mon application que j'ai soumise était codée en dur pour se connecter à un script PHP sur mon serveur qui valide les reçus avec le serveur AppStore réel (alors que ma construction de développement pointe vers un autre script PHP qui valide les Cependant, après quelques échanges avec les ingénieurs D'Apple, j'ai découvert qu'ils utilisent des comptes d'utilisateurs en bac à sable pour tester les applications soumises, qui ça explique pourquoi ils ont eu une erreur.

Au Lieu de construire conditionnellement mon application pour pointer vers un script ou l'autre, j'utiliserai un seul script qui essaiera d'abord le serveur de production, puis retombera sur le serveur sandbox s'il reçoit le code d'état 21007, comme expliqué ci-dessus!

Merci beaucoup!

9
répondu Mathieu Frenette 2012-03-20 21:48:07

Vérifiez toujours votre reçu d'abord avec L'URL de production; procédez à la vérification avec l'URL du bac à sable si vous recevez un code d'état 21007.

Malheureusement, la note technique omet de mentionner que ceci n'est valable que pour les abonnements à renouvellement automatique!

Comme le In-App Guide de programmation D'achat mentionne ci-dessous tableau 7-1:

Important les codes d'état non nuls s'appliquent uniquement lors de la récupération d'informations sur un abonnement auto-renouvelable. Ne pas utilisez ces codes d'état lorsque vous testez des réponses pour d'autres types de produits.

Pour les abonnements non renouvelés, le serveur de production ne renvoie pas de code d'état, mais un reçu approprié.

Dans le cas où vous êtes obligé d'utiliser le non-renouvellement et d'implémenter votre propre logique d'expiration d'Abonnement, une solution possible est d'envoyer la version de votre application à votre serveur, et de garder une trace des versions en développement en ce moment, vous pouvez rediriger vers le bac à sable.serveur itunes à vérifiez les reçus le cas échéant, et imitez le temps d'expiration x-minute d'un abonnement (comme sandbox.itunes fait pour le renouvellement automatique) pour le développement sur votre serveur.

6
répondu g10 2012-06-02 13:13:26