【问题标题】:Method [[UIDevice currentDevice] uniqueIdentifier] is not allowed any more, I need an alternative方法 [[UIDevice currentDevice] uniqueIdentifier] 不再被允许,我需要一个替代方法
【发布时间】:2012-03-12 20:42:42
【问题描述】:

我在所有应用程序中都使用[[UIDevice currentDevice] uniqueIdentifier],Apple 不再允许使用uniqueIdentifier。 我需要使用一些东西来替换 uniqueIdentifier,即使用户删除了应用程序并再次安装它,我也可以使用它来识别用户,(并且让我的应用程序得到苹果的批准)。

谢谢

【问题讨论】:

标签: objective-c ios xcode


【解决方案1】:

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 的替代品,它必须是持久的。
【解决方案2】:

使用数字人的黑客。

修复它以避免应用崩溃。

systemId = [[NSUUID UUID] UUIDstring];

http://developer.apple.com/library/mac/documentation/Foundation/Reference/NSUUID_Class/Reference/Reference.html#//apple_ref/occ/instm/NSUUID/UUIDString

【讨论】:

    【解决方案3】:

    documentation 推荐本节中的操作。

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

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

    【讨论】:

    • 你的意思是我可以将 UUID 添加到设备钥匙串并删除应用程序,当我再次安装它时,我会检索该值并再次使用它?
    • 是的,钥匙串项目保持不变(只要设备未被擦除并设置为新设备),并且当您使用访问组时,您可以允许您的其他应用程序访问相同的钥匙串值.
    • 还有一个问题,我可以使用 MAC 地址来代替我的应用程序并获得苹果的批准吗?
    • 我相信是这样,这看起来是一个不错的方法。您还应该考虑如何跟踪此唯一 ID。例如,如果有人将他们的 iDevice 出售给其他人,而您仅使用 MAC 地址,您将把 2 个不同的用户视为相同(这可能是您想要的,也可能不是您想要的)。
    • @Shantanu 这很有趣,因为在网站顶部写着:随着去年 iOS 6 的发布,Apple 在提供强大、安全的 UDID 替代品方面取得了长足的进步。既然 iOS 6 占据了绝大多数活跃的 iOS 使用量,并且与 Apple 官方弃用 UDID 一致,现在是时候停用 SecureUDID 了。我们建议改用 Apple 的 iOS 6 供应商和广告标识符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 2013-05-17
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 2010-10-13
    相关资源
    最近更新 更多