2

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

LaunchServices:未能获取 vendorID

我猜是某个 Apple 服务器现在已经关闭,很快就会重新上线。

背景:

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

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

“休息”时发生了什么

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

现在发生了什么

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

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

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

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

LaunchServices:未能获取 vendorID

我做了什么来尝试修复它

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

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

谷歌搜索:+“未能获得供应商 ID”

返回零实际结果。我不知所措。

4

2 回答 2

3

看起来静态库项目无权访问 vendorID,但它们确实有权访问 adserID。

这可能是在 XCode 中的模拟器内运行测试的产物——当链接到在真实设备上运行的真实应用程序时,静态库可能可以访问 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;
}

这个从来没有问题。当我直接在模拟器中运行应用程序时,以及当我运行它的(生成的)单元测试时,它都能为供应商获取此设备的 UUID。

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

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

所以在这个测试中,静态库能够获取广告标识符但不能获取标识符ForVendor,并且“成功”能够触发failed to get vendorID错误。

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

希望有帮助!

于 2013-08-04T04:01:20.120 回答
0

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

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

于 2015-09-02T15:04:56.493 回答