26

我已经实现了这个方法来获取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 个字符串 ID 表示。

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

  • 重启了设备
  • 删除了应用程序并重新安装
  • 创建和临时构建、安装、删除并再次安装
  • 从另一个应用程序运行此代码
  • 在带有 iOS 6.0 (10A403) 的 iPad 2 上测试,一切正常(我有正确的标识符)
4

3 回答 3

25

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

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

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

于 2012-09-26T18:30:30.923 回答
8

Apple 应技术支持事件请求确认了其系统中的此错误。他们说,identifierForVendor有时advertisingIdentifier在开发版本和从 App Store 无线下载的应用程序中都可以看到返回全零。他们没有解决方法,也不能说问题何时会得到解决。

于 2012-10-20T19:57:06.743 回答
0

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

建议是推迟 ID 检索,所以你可以这样调用 sometginh:

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

稍后获取 ID。

于 2013-06-28T08:27:38.833 回答