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

时间:2013-08-02 16:59:06

标签: ios testing in-app-purchase

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

LaunchServices:未能获得vendorID

我猜这是现在已经关闭的苹果服务器,并且很快就会重新上线。

背景

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

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

“休息”时发生了什么

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

现在发生了什么

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

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

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

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

LaunchServices:未能获得vendorID

我尝试修复它的方法

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

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

我对两种不同的方案进行了简要测试,并能够可靠地使LaunchServices: failed to get vendorID错误出现在其中一种情况下。

首先,我使用内置模板在XCode中创建了一个“Empty Application”。我只改变了这种方法:

- (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就好了。

然后我在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库。然后当我执行测试时,模拟器弹出,这是我看到的输出:< / p>

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)?这些是潜在的来源,可能给你类似行为的两个测试用例中的最后一个。

希望有所帮助!

答案 1 :(得分:0)

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

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