广告标识符(advertisingIdentifier)和供应商标识符(identifierForVendor)返回“00000000-0000-0000-0000-000000000000”。

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上运行时,这2个方法将返回“00000000-0000-0000-0000-000000000000”作为标识符。 已经完成的操作:

  • 重新启动设备
  • 删除并重新安装应用程序
  • 创建Ad-Hoc构建,安装,删除并再次安装
  • 从另一个应用程序运行此代码
  • 在搭载iOS 6.0(10A403)的iPad 2上进行了测试,一切都很好(我得到了正确的标识符)
3个回答

25

这似乎是iOS的一个bug。在通过空中升级的设备上出现了同样的问题,但是使用Xcode或iTunes升级的设备按预期工作而没有零。

我尝试了与您类似的步骤,唯一的共同点是空中升级(不好)与连接升级(好)。

更新: 直接从iOS 5.1升级到6.1的用户通过空中升级会有不同的行为。每次完全关闭并重新启动应用程序时,identifierForVendor都会返回一个新值。如果应用程序被卸载并重新安装,那么这是可以预期的,但实际情况并非如此。


这似乎是正确的,因为在苹果论坛上进行了搜寻(需要使用您的开发者帐户登录)。 - J. Costa
9
苹果公司删除了一项功能(UID),并用一个“不起作用”的东西进行了替换,这很有趣。 - Glenn Maynard
5
我们刚刚通过无线方式将几台设备升级到了iOS 6.0.1,现在identifierForVendor看起来已经修复了。 - MattP

8

苹果公司在回应技术支持事件请求时确认了他们系统中的这个漏洞。他们称identifierForVendoradvertisingIdentifier有时会返回全零,在开发版本和通过App Store下载的应用程序中均可见。他们没有解决方法,也无法确定何时可以修复该问题。


请问您能否发布一个链接,让我可以查看他们的回复?我将 advertisingIdentifier 设为主键,现在它在我的应用程序中引起了巨大的问题。 - Geet

0

有些情况下,API 返回空的 ID 响应,比如设备恢复后。

建议延迟 ID 的获取,可以这样调用:

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

稍后再获取ID。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接