与应用内购买“无法连接到iTunes”相关联的vendorID错误消息是什么?

这是一个神秘的错误消息:

LaunchServices:无法获得vendorID

我猜这是现在已经关闭的一些Apple服务器,很快就会重新上线。

背景:

我的iOS应用程序没有先前批准的应用内购买,因此这仍然是必须与新的应用内购买产品一起提交新版本应用的阶段。 iTunes Connect中配置了三个测试用户。

今天之前的测试已成功购买测试产品,并检索以前购买的信息。

在“rest”时发生了什么

今天早些时候,我添加了一些服务器获取代码来validation事务。 此代码在处理事务队列之后执行,因此在成功获取信息之后。

现在发生了什么

应用内购买代码使用StoreKit框架请求产品,并接收它们并适当地显示UI。 因此,StoreKit目前至少有一定程度的成功。

当我点击UI按钮启动检索过去购买代码时,我输入测试用户的凭据,然后我坐下来等待。 几秒钟之后,似乎超时,出现错误“无法连接到iTunes Store”。

这在iPhone设备和模拟器上都会发生。

但是,运行应用程序时Xcode的输出窗格中的错误消息显示以下错误,当我按下按钮恢复事务时立即显示,并且当连接与测试用户连接失败时再次出现。

LaunchServices:无法获得vendorID

我做了什么来试图解决它

在iPhone上,我退出了我的真实用户,然后使用了测试用户凭据,在模拟器中,我清理了〜/ Library / Application Support / iPhone Simulator / 6.1 / Library / com.apple.itunesstored / *文件。

我重新启动了macbook,同样的事情。

谷歌搜索:+“未能获得vendorID”

返回零实际结果。 我很茫然。

看起来静态库项目无法访问vendorID,但他们可以访问advertiserID。

这可能是在XCode中在模拟器内运行测试的工件 – 当链接到真实设备上运行的真实应用程序时,静态库可以访问vendorID。

我对两种不同的场景进行了简要测试,并且能够可靠地使LaunchServices: failed to get vendorID在其中一个LaunchServices: failed to get vendorID出现了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; } 

这个从未出现过问题。 当我直接在模拟器中运行应用程序时,以及当我运行其(生成的)unit testing时,它能够为供应商获取此设备的UUID就好了。

然后我在XCode模板中创建了一个“Cocoa Touch Static Library” 。 我在生成的源文件上只创建了一个类方法。

 + (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而不是identifierForVendor,并且“成功”地能够触发failed to get vendorID错误。

您是否可能使用自己编写的静态库,或者来自外部供应商(例如Flurry)? 这些是潜在的来源, 可能会给你类似的行为,两个测试用例的最后一个。

希望有所帮助!

我在没有主机应用程序的项目中使用xctool运行测试时xctool了同样的问题。 也就是说,我只有一个测试目标。 我的解决方案是添加一个应用程序目标,并将其设置为测试目标的主机应用程序(测试目标的常规选项卡)。 这实质上是重新创建在Xcode中创建新项目时通常会设置的内容。 在我的情况下,我还必须添加AppDelegate

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