与“无法连接到 iTunes”以进行应用内购买相关的这个 vendorID 错误消息是啥?

Posted

技术标签:

【中文标题】与“无法连接到 iTunes”以进行应用内购买相关的这个 vendorID 错误消息是啥?【英文标题】:What is this vendorID error message associated with "Cannot Connect to iTunes" for in-app purchase?与“无法连接到 iTunes”以进行应用内购买相关的这个 vendorID 错误消息是什么? 【发布时间】:2013-08-02 16:59:06 【问题描述】:

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

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,同样的事情。

谷歌搜索: +"获取vendorID失败"

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

【问题讨论】:

好的,这似乎是一个松散相关的错误消息。无法连接错误已经发生了几个小时,巧合(或不)在我执行服务器端提交/推送和客户端应用程序提交之后立即发生,并且没有做任何其他工作,现在突然错误已经解决了。登录似乎成功并且再次收到交易,但“获取供应商ID 失败”仍在继续,并且似乎仅在模拟器上。 【参考方案1】:

看起来静态库项目无法访问vendorID,但它们确实可以访问advertisingrID。

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

希望有帮助!

【讨论】:

我正在使用静态库并且也看到了这一点。如果我从Xcode gui 或使用xcodebuild 运行我的测试,一切都很好,但是当我使用xctool 时会中断。【参考方案2】:

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

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

【讨论】:

以上是关于与“无法连接到 iTunes”以进行应用内购买相关的这个 vendorID 错误消息是啥?的主要内容,如果未能解决你的问题,请参考以下文章

无法连接到 iTunes Store(获取应用内购买列表)

在 InAppBillingPlugin for Xamarin 之后,应用内购买无法连接到 iTunes 商店 ios 12

如何修复应用内购买错误“交易错误:无法连接到 iTunes Store 代码 0”? [复制]

应用程序无法连接到 iTunes Store

IAP - 无法连接到iTunes Store - 仅在Apple审核期间

iPhone In-App Purchase Store Kit 错误 -1003“无法连接到 iTunes Store”