【问题标题】:How to generate unique identifier which should work in all iOS versions?如何生成适用于所有 iOS 版本的唯一标识符?
【发布时间】:2013-07-14 16:47:28
【问题描述】:

我想获得应该支持所有 iOS 版本的唯一标识符。任何人都可以帮助我解决这个问题。如您所知,苹果不推荐使用 UDID 方法,因此有可能使用 wifi-mac 地址生成唯一 id。但苹果将在 iOS7 版本中删除 wifi mac 地址。所以我的要求是生成一个新的唯一代码应该适用于所有 iOS 版本。在此先感谢..

注意:一旦用户重新启动设备或重新安装应用程序,请勿更改 UDID。

【问题讨论】:

  • 他们弃用这些唯一 ID 是有原因的。创建并存储您自己的 UUID (CFUUIDCreate) 或使用供应商标识符

标签: iphone ios uniqueidentifier udid


【解决方案1】:

我现在无法访问代码(如果您仍然需要,可以在几个小时后发布),但我所做的是在帮助程序类中创建一个静态方法“deviceIdentifier”。

该方法对当前iOS版本进行基本检查,如果低于6.0则返回UDID,否则返回uniqueIdentifier

如果您想要代码,请告诉我,我会在可能的时候发布它。如果我没记错的话,它只有 10-15 行左右,但会产生很大的不同,因为您可以调用 ' [myHelper deviceIdentifier]' 任何需要设备 ID 的地方,而不必担心他们使用的是哪个 iOS 版本

【讨论】:

  • 非常感谢您提供的快速信息。如您所知,Apple 已弃用 UDID 方法,因此我实现了使用 Mac 地址生成唯一标识符。但是苹果将在 iOS7 版本中删除 wifi mac 地址。所以我需要生成一个新的唯一代码,它应该适用于包括 iOS7 在内的所有版本。你能分享你的逻辑,这样对我有很大帮助.. 再一次谢谢你..
  • 嗨 Gahesh - 刚刚仔细检查了我的代码并记得我完全从那里取出了 pre-identifierForVendor 代码只是为了确保符合 Apple 准则,我认为他们对在新版本中使用 UDID 的人非常严格应用程序甚至只是为了支持旧版本的 iiOS
  • 所以我只是使用 identifierForVendor ,我知道它不能满足您的要求,即即使在应用卸载时它也必须保持不变
  • 嗨,James,idenetifierForVendor 可从 iOS 6 获得。但是使用它我们可以支持 iOS6 或更高版本的设备。我的问题是如何支持较低版本。我坚信有一个解决方案。让我们拭目以待吧:)
【解决方案2】:

现在设备标识符更改为 UUID。您可以借助以下代码获取 UUID:

- (NSString *)getUUID
{
    NSString *UUID = [[NSUserDefaults standardUserDefaults] objectForKey:@"uniqueID"];
    if (!UUID) {
        CFUUIDRef theUUID = CFUUIDCreate(NULL);
        CFStringRef string = CFUUIDCreateString(NULL, theUUID);
        CFRelease(theUUID);
        UUID = [(__bridge NSString*)string stringByReplacingOccurrencesOfString:@"-"withString:@""];
        [[NSUserDefaults standardUserDefaults] setValue:UUID forKey:@"uniqueID"];
    }
    return UUID;
}

它适用于所有 iOS 版本。

【讨论】:

  • 是的,一旦重新安装应用程序,UDID 就会发生变化。这个逻辑不能完全满足我的要求。无论如何感谢您的逻辑。
【解决方案3】:

我正在更新我的应用程序,该应用程序仅基于支持 iOS 4.3 及更高版本的唯一标识符运行。所以,

1) 我无法使用[UIDevice currentDevice].uniqueIdentifier;,因为它不再可用

2) 我无法使用[UIDevice currentDevice].identifierForVendor.UUIDString,因为它仅适用于 iOS 6.0 及更高版本,并且无法用于较低的 iOS 版本。

3) mac 地址不是一个选项,因为它在 iOS-7 中是不允许的

4) OpenUDID 之前是 deprecated,并且在 iOS-6 上也有问题。

5) 广告标识符也不适用于 iOS-5 及以下版本

我终于做到了

a) 将SFHFKeychainUtils 添加到项目中

b) 生成的 CFUUID 密钥字符串

 CFUUIDRef cfuuid = CFUUIDCreate(kCFAllocatorDefault);
    udidString = (NSString*)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, cfuuid));

c) 将其保存到 Key Chain Utils 否则每次都会生成一个新的唯一性

最终代码

+ (NSString *)GetDeviceID {
    NSString *udidString;
   udidString = [self objectForKey:@"deviceID"];
    if(!udidString)
    {
    CFUUIDRef cfuuid = CFUUIDCreate(kCFAllocatorDefault);
    udidString = (NSString*)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, cfuuid));
    CFRelease(cfuuid);
        [self setObject:udidString forKey:@"deviceID"];
    }
    return udidString;
}

+(void) setObject:(NSString*) object forKey:(NSString*) key
{
    NSString *objectString = object;
    NSError *error = nil;
    [SFHFKeychainUtils storeUsername:key
                         andPassword:objectString
                      forServiceName:@"LIB"
                      updateExisting:YES
                               error:&error];

    if(error)
        NSLog(@"%@", [error localizedDescription]);
}

+(NSString*) objectForKey:(NSString*) key
{
    NSError *error = nil;
    NSString *object = [SFHFKeychainUtils getPasswordForUsername:key
                                                  andServiceName:@"LIB"
                                                           error:&error];
    if(error)
        NSLog(@"%@", [error localizedDescription]);

    return object;
}

For further Details

【讨论】:

  • 谢谢你。请注意 SFHFKeychainUtils 的创建者说它应该被视为已弃用,而应该使用他的 STUtils。此外,还应该在上面的GetDeviceID 方法中添加CFRelease(cfuuid);,以防止内存泄漏。
  • @ghr。是的,他说它应该被视为已弃用,但我正在使用它。在许多应用中没有任何问题。第二个谢谢你,我不知何故跳过了。
  • @NSQuamber.java,这个生成的 id 会在卸载应用后更改吗?我有一个要求,即 id 必须是唯一的并且将被发送到服务器。即使用户卸载/重新安装应用程序,我也应该有相同的 id。您的解决方案可以做到这一点吗?另外,它仍然适用于 iOS 8.4 吗?
  • 感觉苹果讨厌开发者.. :-)
  • @shamaleyte 你能测试一下吗?我还需要获取设备的唯一标识符,该标识符在重新安装应用程序后不会更改
猜你喜欢
  • 1970-01-01
  • 2020-04-06
  • 1970-01-01
  • 2017-12-06
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多