方法[[UIDevice currentDevice] uniqueIdentifier]不再被允许使用,我需要一种替代方法。

8

我在我的所有应用中使用[[UIDevice currentDevice] uniqueIdentifier],但是苹果不再允许使用uniqueIdentifier。 我需要一些替代uniqueIdentifier的东西,可以识别用户,即使用户删除应用程序并重新安装它,(还可以通过苹果审核)。

谢谢


3个回答

12

文档建议在本节中执行以下操作。

特别考虑
不要使用uniqueIdentifier属性。要创建一个特定于您的应用程序的唯一标识符,您可以调用CFUUIDCreate函数创建UUID,并使用NSUserDefaults类将其写入默认数据库。

为确保唯一标识符在删除应用程序后仍然存在,您应该将其存储在钥匙串而不是NSUserDefaults中。使用钥匙串,您还可以使用密钥链访问组在同一设备上的所有应用程序之间共享相同的唯一ID。这种方法将防止您在设备不再属于用户时错误跟踪用户,并且它将在从备份中恢复的任何新i设备上可用。


你的意思是我可以将UUID添加到设备钥匙串中,然后删除应用程序,再次安装时检索该值并再次使用它? - user784625
是的,钥匙串项目保持持久性(只要设备没有被擦除并设置为新设备),当您使用访问组时,您可以允许您的其他应用程序访问相同的钥匙串值。 - Joe
还有一个问题,我能使用MAC地址而不影响我的应用在苹果商店的审核吗? - user784625
1
我相信这是一个不错的方法。你还应该考虑如何跟踪这个唯一的ID。例如,如果有人将他们的iDevice卖给别人,而你只使用MAC地址,那么你将把两个不同的用户视为同一个用户(这可能是你想要的,也可能不是)。 - Joe
@Shantanu 这很有趣,因为网站顶部写着:随着去年发布的iOS 6,苹果在提供强大、安全的UDID替代方面取得了巨大进展。现在,由于iOS 6占据了活跃iOS使用的绝大多数,并且与苹果官方废弃UDID相结合,是时候也退役SecureUDID了。我们建议使用苹果的iOS 6供应商和广告标识符。 - Joe
@Joe:谢谢你让我注意到这个问题。下次在发布之前,我会仔细阅读。这对我和其他人都有好处 :) - Shantanu

3

iOS 7及以下版本的更新:

+ (NSString *)uniqueDeviceIdentifier
{
    NSString *device_id = nil;

    if ([[self deviceModel] isEqualToString:@"Simulator iOS"]) {
        // static id for simulator
        device_id = @"== your random id ==";
    }
    else if (CurrentIOSVersion >= 6.f) {
        // iOS 6 and later
        device_id = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
    }
    else {
        // iOS 5 and prior
        SEL udidSelector = NSSelectorFromString(@"uniqueIdentifier");
        if ([[UIDevice currentDevice] respondsToSelector:udidSelector]) {
            device_id = [[UIDevice currentDevice] performSelector:udidSelector];
        }
    }
    NSLog(@">>>>>> device_id: %@", device_id);
    return device_id;
}

您可以通过以下方式获取设备模型:

+ (NSString*)deviceModel
{
    static NSString *device_model = nil;

    if (device_model != nil)
        return device_model;

    struct utsname systemInfo;
    uname(&systemInfo);
    NSString *str = @(systemInfo.machine);

    return device_model;
}

这段代码的问题在于,在iOS 6或更高版本上,每次调用它都会返回不同的值。要成为“uniqueIdentifier”的替代品,它需要是持久的。 - kamprath

0

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