看起来静态库项目无权访问 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)的静态库?这些是潜在的来源,可能会为您提供与两个测试用例中的最后一个类似的行为。
希望有帮助!