Что это за сообщение об ошибке vendorID, связанное с "Cannot Connect to iTunes" для покупки в приложении?

Вот таинственное сообщение об ошибке:

LaunchServices: не удалось получить vendorID

Я предполагаю, что это какой-то сервер Apple, который сейчас недоступен и скоро вернется в сеть.

Фон:

В моем iOS-приложении нет утвержденных ранее покупок в приложении, так что это все еще этап, на котором необходимо представить новую версию приложения вместе с новым продуктом для покупок в приложении. В iTunes Connect настроены три тестовых пользователя.

Тестирование до сегодняшнего дня было успешным с покупкой тестируемых продуктов и извлечением ранее приобретенной информации.

Что случилось во время "перерыва"

Ранее сегодня мне был добавлен некоторый код выборки сервера для проверки транзакций. Этот код выполняется после обработки очереди транзакций, то есть после успешного извлечения информации.

Что сейчас происходит

Код покупки в приложении запрашивает продукты с использованием среды StoreKit, получает их и отображает пользовательский интерфейс соответствующим образом. Так что на данный момент у StoreKit есть хоть какой-то успех.

Когда я нажимаю кнопку пользовательского интерфейса, чтобы запустить код получения прошлых покупок, я ввожу учетные данные для тестового пользователя и сижу и жду. Тайм-аут, казалось бы, через много секунд появляется ошибка "Не удается подключиться к iTunes Store".

Это происходит как на устройстве iPhone, так и на симуляторе.

Но сообщение об ошибке в области вывода XCode при запуске приложения показывает следующую ошибку, и оно появляется сразу, когда я нажимаю кнопку, чтобы восстановить транзакции, и снова, когда не удается установить соединение с тестовым пользователем.

LaunchServices: не удалось получить vendorID

Что я сделал, чтобы попытаться это исправить

На iPhone я вышел из своего реального пользователя и затем использовал учетные данные тестового пользователя, а в симуляторе я очистил файлы ~/Library/Application Support/iPhone Simulator/6.1/Library/com.apple.itunesstored/*.

Я перезапустил MacBook, тоже самое.

Поиск в Google: +"не удалось получить vendorID"

возвращает ноль реальных результатов. Я в недоумении.

2 ответа

Решение

Похоже, что проекты статических библиотек не имеют доступа к vendorID, но у них есть доступ к advertiserID.

Это может быть артефактом запуска тестов внутри симулятора в XCode - возможно, статическая библиотека имеет доступ к идентификатору вендора при подключении к реальному приложению, запущенному на реальном устройстве.

Я провел краткий тест двух разных сценариев и смог надежно LaunchServices: failed to get vendorID ошибка появляется под одним из них.

Сначала я создал "Пустое приложение" в XCode, используя встроенный шаблон. Я изменил только этот метод:

- (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;
}

У этого никогда не было проблем. И когда я запускал приложение непосредственно в симуляторе, и когда я запускал его (сгенерированные) модульные тесты, он мог просто получить UUID этого устройства для поставщика.

Затем я создал "Статическую библиотеку Cocoa Touch" в шаблоне XCode. Я создал только один метод класса в сгенерированном исходном файле.

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

Затем я изменил сгенерированный тест

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

И, наконец, я убедился, что изменил цель "ReportDeviceTests" и добавил AdSupport библиотека, к которой нужно подключиться. А потом, когда я выполнил тесты, появился симулятор, и вот результат, который я увидел:

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).

Таким образом, в этом тесте статическая библиотека смогла получить AdvertisingIdentifier, но не идентификатор ForVendor, и "успешно" смогла вызвать failed to get vendorID ошибка.

Возможно ли, что вы используете статические библиотеки, которые вы написали, или они получены от внешнего поставщика (скажем, Flurry)? Это потенциальные источники, которые могут дать вам поведение, подобное последнему из двух тестовых случаев.

Надеюсь, это поможет!

У меня была такая же проблема при выполнении тестов с xctool в проекте без хост-приложения. То есть у меня был только тестовый объект. Для меня было решение добавить цель приложения и установить ее в качестве основного приложения для цели теста (вкладка "Общие" для цели теста). По сути, это воссоздает то, что обычно настраивается при создании нового проекта в XCode. В моем случае мне также пришлось добавить AppDelegate с:

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

Другие вопросы по тегам