Quel est le message d'erreur "VendorID" associé à "Impossible de se connecter à iTunes" pour un achat via une application?

Voici un message d'erreur mystérieux:

LaunchServices: impossible d'get l'identificateur de fournisseur

Je suppose que c'est un server Apple qui est en panne en ce moment, et qui sera bientôt de return en ligne.

Context:

Mon application iOS n'a pas d'achats embeddeds déjà approuvés. Il s'agit donc de l'étape où une nouvelle version de l'application doit être soumise avec un nouveau produit d'achat embedded. Trois users de test sont configurés dans iTunes Connect.

Les tests effectués avant aujourd'hui ont réussi à acheter des produits de test et à récupérer les informations précédemment achetées.

Qu'est-il arrivé au moment de "pause"

Plus tôt aujourd'hui, j'ai été ajouté un code de récupération de server pour valider les transactions. Ce code s'exécute après le traitement de la queue de transaction, donc après une extraction réussie d'informations.

Qu'est ce qui se passe maintenant

Le code d'achat embedded à l'application request les produits à l'aide de l'infrastructure StoreKit, les reçoit et affiche l'interface user de manière appropriée. Donc, il y a au less un certain niveau de succès avec StoreKit en ce moment.

Lorsque j'appuie sur le button de l'interface user pour lancer le code resortingeve-past-achats, j'entre les informations d'identification pour un user de test, et je m'assieds et j'attends. Timeout, il semblerait, pendant plusieurs secondes plus tard, l'erreur "Impossible de se connecter à iTunes Store" apparaît.

Cela se produit à la fois sur l'appareil iPhone et sur le simulateur.

Mais le message d'erreur dans le volet de sortie de Xcode lors de l'exécution de l'application affiche l'erreur suivante, et il apparaît immédiatement lorsque j'appuie sur le button pour restaurer les transactions, et à nouveau lorsque la connection échoue avec l'user de test.

LaunchServices: impossible d'get l'identificateur de fournisseur

Ce que j'ai fait pour essayer de le réparer

Sur l'iPhone, je me suis déconnecté de mon vrai user et j'ai ensuite utilisé les informations d'identification de l'user de test, et dans le simulateur, j'ai nettoyé les files ~ / Bibliothèque / Application Support / iPhone Simulator / 6.1 / Bibliothèque / com.apple.itunesstored / *.

J'ai redémarré le macbook, même chose.

Une search google pour: + "Impossible d'get l'identificateur de fournisseur"

renvoie zéro résultat réel. Je suis à perte.

Il semble que les projets de bibliothèques statiques n'ont pas access à l'identificateur de fournisseur, mais ils ont access à l'ID de l'annonceur.

Cela peut être un artefact de l'exécution des tests dans le simulateur dans XCode – une bibliothèque statique peut avoir access à l'identificateur de fournisseur lorsqu'elle est liée à une application réelle exécutée sur un périphérique réel.

J'ai couru un court test de deux scénarios différents, et LaunchServices: failed to get vendorID de manière fiable LaunchServices: failed to get vendorID erreur LaunchServices: failed to get vendorID apparaître sous l'un d'entre eux.

D'abord, j'ai créé une "application vide" dans XCode en utilisant le model embedded. Je n'ai modifié que cette méthode:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSLog(@"Vendor ID: %@", [UIDevice currentDevice].identifierForVendor); self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; return YES; } 

Celui-ci n'a jamais eu de problème. À la fois lorsque j'ai lancé l'application directement dans le simulateur, et quand j'ai exécuté ses tests unitaires (générés), elle a réussi à get l'UUID de ce périphérique pour le fournisseur.

Ensuite, j'ai créé une "Bibliothèque statique de Cocoa Touch" dans le model XCode. J'ai créé une seule méthode de class sur le file source généré.

 + (void)logDeviceIDs { NSLog(@"Vendor ID: %@", [UIDevice currentDevice].identifierForVendor); NSLog(@"Advert ID: %@", [ASIdentifierManager sharedManager].advertisingIdentifier); } 

J'ai ensuite modifié le test généré

 - (void)testExample { [ReportDevice logDeviceIDs]; } 

Et finalement, je me suis assuré de modifier la cible "ReportDeviceTests" et d'append la bibliothèque AdSupport à relier. Et puis, quand j'ai exécuté les tests, le simulateur est apparu et c'est la sortie que j'ai vue:

 ReportDeviceTests.octest(Tests)' started at 2013-08-04 03:56:00 +0000 Test Suite 'ReportDeviceTests' started at 2013-08-04 03:56:00 +0000 Test Case '-[ReportDeviceTests testExample]' started. 2013-08-03 21:56:00.786 otest[61857:303] LaunchServices: failed to get vendorID 2013-08-03 21:56:00.786 otest[61857:303] Vendor ID: (null) 2013-08-03 21:56:00.787 otest[61857:303] Advert ID: <__NSConcreteUUID 0x24bab30> 5801847F-4679-4701-8B07-28449EF92CB4 Test Case '-[ReportDeviceTests testExample]' passed (0.002 seconds). 

Donc, dans ce test, la bibliothèque statique a pu get l'identifiant de la publicité, mais pas l'identificateur failed to get vendorID , et a pu "réussir" à triggersr l' failed to get vendorID erreur failed to get vendorID .

Est-il possible que vous utilisiez des bibliothèques statiques que vous avez écrites ou qui proviennent d'un fournisseur externe (par exemple, Flurry)? Ce sont des sources potentielles qui pourraient vous donner un comportement similaire au dernier des deux cas de test.

J'espère que cela pourra aider!

J'ai eu le même problème en exécutant des tests avec xctool dans un projet sans application hôte. Autrement dit, je n'avais qu'une cible de test. La solution pour moi consistait à append une cible d'application et à la définir comme application hôte pour la cible de test (onglet général pour la cible de test). Ceci recréant essentiellement ce qui serait normalement configuré lors de la création d'un nouveau projet dans Xcode. Dans mon cas, j'ai aussi dû append l' AppDelegate avec:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { return YES; }