在iOS6之前的应用程序中使用UDID(以及6.0+版本的IDFA)



iOS6的新IDFA功能可用于运行iOS6的用户的转换跟踪。然而,如果应用程序的最低支持版本低于iOS 6,那么在iOS6之前的设备上运行时,可接受的处理方法是什么?

Jumptap提到您仍然可以在iOS6之前的设备上使用UDID:

广告标识符(IDFA)是在iOS 6中引入的。它被广告商用来跟踪转化率和高级定位等。在使用iOS 6(或更高版本)的设备上,IDFA旨在取代UDID作为设备标识符。在使用iOS 5(或更低版本)的设备上,苹果将继续支持使用UDID作为设备标识符。

不过我对此并不满意。iOS版本检查是运行时的事情,这意味着您的代码将始终静态链接到不推荐使用的UDID访问器,并且只有在运行时才决定是否读取它。当然,苹果的审查过程会看到UDID的静态链接,并拒绝该应用程序。他们不会对代码进行反编译并确认您的逻辑是正确的,也不会尝试进行100%的代码覆盖率测试以确认在iOS6中运行时从未读取过代码。是吗?!?!

此外,AppsFlyer提到UDID可以在他们的SDK中启用,并注意到:

*UDID详细信息:一些广告网络(例如Tapjoy)需要UDID来运行CPI活动。在上面提到的情况下,你需要启用UDID并更新你的应用条款&带有明确隐私声明的条件,通知您的用户收集他们的私人信息。

这似乎意味着只要你通知用户,UDID仍然可以被读取。然而,我在苹果官方文档中找不到任何提及这一点的内容。

它们很可能不是,但应该是。但你看,苹果的目标不是取悦开发者;他们的目标是取悦自己(即赚很多钱)。

如果你担心这一事件最终会发生在你身上(这是一种相当合理的恐惧),那么你可以尝试混淆对该特定消息的调用(只在iOS 5及更高版本上调用,以免违反TOS)。示例:

NSString *str1 = @"ueId";
NSString *str2 = @"uniq";
NSString *sel = [NSString stringWithFormat:@"%@%@ent%cfi%s", str2, str1, 'i', "er"];
SEL msg = NSSelectorFromString(sel);
if (iOS_5_or_older) {
    deviceID = [[UIDevice currentDevice] performSelector:msg];
}

这是一种相当弱的"混淆",但如果苹果真的变得懒惰和/或决定欺骗你,这可能足以通过故事的静态分析部分。

UDID现在无法通过验证。转到OpenUDID。

相关内容

最新更新