如何生成适用于所有iOS版本的唯一标识符?

我想获得应该支持所有iOS版本的唯一标识符。可以帮助我解决这个问题。 如你所知,苹果已被废弃的UDID方法,所以有可能使用WiFi-MAC地址生成唯一的ID。但苹果将删除iOS7版本的WiFi MAC地址。所以我的要求是生成一个新的唯一代码应该在所有iOS版本中工作。

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

我正在更新我的应用程序,只工作的唯一标识符支持iOS 4.3及以上。 所以,

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

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

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

4) OpenUDID在前一段时间被弃用 ,而iOS-6也出现问题。

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

最后这就是我所做的

a)将SFHFKeychainUtils添加到项目中

b)生成的CFUUID键string

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

c)将它保存到Key Chain Utils中,否则它会生成一个新的Unique Time

最后的代码

 + (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; } 

在这里输入图像说明

欲了解更多详情

现在设备标识符更改为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版本中工作。

我现在还没有访问代码(如果你仍然需要,可以在几个小时后发布),但是我所做的是在助手类中创build静态方法“deviceIdentifier”。

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

让我知道如果你想要的代码,我会发布它时,我可以..只有10-15行左右,如果我记得正确,但有很大的不同,因此,你可以调用'[myHelper deviceIdentifier ]'无论你需要一个设备ID,而不必担心他们正在使用哪个iOS版本