advertisingIdentifier和identifierForVendor返回“00000000-0000-0000-0000-000000000000”

我已经实现了这个方法来获取advertisingIdentifieridentifierForVendor

 - (NSString *) advertisingIdentifier { if (!NSClassFromString(@"ASIdentifierManager")) { return [OpenUDID value]; } return [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]; } - (NSString *) identifierForVendor { if ([[UIDevice currentDevice] respondsToSelector:@selector(identifierForVendor)]) { return [[[UIDevice currentDevice] identifierForVendor] UUIDString]; } return @""; } - (BOOL)isAdvertisingTrackingEnabled { if (NSClassFromString(@"ASIdentifierManager") && ![[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled]) { return NO; } return YES; } 

在模拟器上一切正常,我可以得到2个string的ID代表。

但是,当我从iPhone 3GS与iOS 6.0(10A403)运行,这两个方法返回“00000000-0000-0000-0000-000000000000”作为标识符。 已经完成了:

  • 重新启动设备
  • 删除了应用程序并重新安装
  • 创build和Ad-Hoc构build,安装,删除和再次安装
  • 从另一个应用程序运行此代码
  • 使用iOS 6.0(10A403)在iPad 2上进行testing,一切正常(我已经得到正确的标识符)

这似乎是在iOS中的错误。 在无线升级的设备上看到相同的问题,但使用Xcode或iTunes升级的设备按预期工作而不带零。

尝试了类似的步骤,唯一的共同主题是空中(坏)与系留升级(好)。

更新:直接从iOS 5.1移动到6.1的用户会遇到不同的行为。 每当应用程序完全closures并重新启动时, identifierForVendor将返回一个新值。 如果应用程序被卸载并重新安装,这将是预期的,但事实并非如此。

苹果在他们的系统中确认了这个错误,以回应技术支持事件请求。 他们说, identifierForVendoradvertisingIdentifier有时候会返回所有的零,可以在开发版本和应用程序商店下载的应用程序中看到。 他们没有解决问题的时间,也不能说什么时候解决问题。

在某些情况下,API会像设备恢复​​之后那样返回ID空的响应。

build议是推迟ID retreival,所以你可以这样调用sometginh:

 -(void)retrieveID { if (<check fails>) [self performSelector:@"retrieveID" withObject:nil afterDelay:1.0]; } 

稍后取回ID。