iOS7应用在iOS5上的向后兼容性问题:唯一标识符。

10

我的应用程序与iOS5和iOS6兼容。 到目前为止,我使用没有问题的是:

NSString DeviceID = [[UIDevice currentDevice] uniqueIdentifier];

现在iOS7以后,uniqueIdentifier已经不能使用了,我改成了:

NSString DeviceID = [[[UIDevice currentDevice] identifierForVendor] UUIDString];

问题是,这种方法不适用于iOS5。
如何实现与iOS5的向后兼容?
我尝试了这个方法,但没有成功:
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 60000
    // iOS 6.0 or later
    NSString DeviceID = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
#else
    // iOS 5.X or earlier
    NSString DeviceID = [[UIDevice currentDevice] uniqueIdentifier];
#endif

或许 openUDID 可以成为你的合适替代品? - Tim Bodeit
openUDID不是正确的答案。http://blog.appsfire.com/udid-is-dead-openudid-is-deprecated-long-live-advertisingidentifier/ - Grzegorz Krukowski
1
你不能使用编译时指令,你需要运行时检查。 - rmaddy
3个回答

6
苹果公司推荐的最佳选择是:
 NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];

请在5.0以上的设备上使用它。

对于5.0版本,您需要使用uniqueIdentifier。最好的方法是检查它是否可用:

if (!NSClassFromString(@"ASIdentifierManager"))

结合起来,这将给你:

- (NSString *) advertisingIdentifier
{
    if (!NSClassFromString(@"ASIdentifierManager")) {
        SEL selector = NSSelectorFromString(@"uniqueIdentifier");
        if ([[UIDevice currentDevice] respondsToSelector:selector]) {
            return [[UIDevice currentDevice] performSelector:selector];
        }
        //or get macaddress here http://iosdevelopertips.com/device/determine-mac-address.html
    }
    return [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
}

感谢Grzegorz Krukowski。仍然会出现“UIDevice没有声明uniqueIdentifier选择器”的错误,因为Apple从UIDevice类中删除了uniqueIdentifier属性。 - Khaytaah
好的,那就修改那一部分:在这种情况下返回[[UIDevice currentDevice] uniqueIdentifier]; 为其他UID :) 要么自己生成或在这种情况下使用UUID或获取MAC地址 - 我更新了我的答案。 - Grzegorz Krukowski
好的,我找到了另一种更安全的使用 respondsToSelector 和 performSelector 的方法 - 这不应该引发错误。 - Grzegorz Krukowski
感谢Grzegorz Krukowski! - Khaytaah
3
苹果不再允许在应用程序中无广告的情况下使用“ASIdentifierManager”功能。如果您未显示横幅广告,将被拒绝使用“ASIdentifierManager”。 - rckoenes

1
为什么不使用CFUUIDRef并且独立于iOS版本?
CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);

self.uuidString = (NSString *)CFUUIDCreateString(NULL,uuidRef);

CFRelease(uuidRef);

当然,记得在钥匙串中保存计算出的uuidString(以防应用程序被删除)吗?

这里写了如何使用钥匙串


0

如果你想要替换静态宏,可以尝试使用动态if语句进行检查。

UIDevice有一个名为'systemVersion'的属性,你可以在这里进行检查。


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