我希望能够获得一个唯一标识符,该标识符应支持所有iOS版本。有人能帮我解决这个问题吗?正如你所知,苹果已经弃用了UDID方法,因此可能使用wifi_mac地址生成唯一标识符。但是苹果将在iOS7版本中删除wifi mac地址。因此,我的要求是生成一个新的唯一代码,它应该在所有iOS版本中都可以工作。谢谢!
注意:一旦用户重新启动设备或重新安装应用程序,请勿更改UDID。
我希望能够获得一个唯一标识符,该标识符应支持所有iOS版本。有人能帮我解决这个问题吗?正如你所知,苹果已经弃用了UDID方法,因此可能使用wifi_mac地址生成唯一标识符。但是苹果将在iOS7版本中删除wifi mac地址。因此,我的要求是生成一个新的唯一代码,它应该在所有iOS版本中都可以工作。谢谢!
注意:一旦用户重新启动设备或重新安装应用程序,请勿更改UDID。
我正在更新我的应用程序,该应用程序仅基于唯一标识符操作,支持因此,
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键字符串
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;
}
CFRelease(cfuuid);
以防止内存泄漏。 - ghr- (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版本。
我现在没有访问代码的权限(如果您仍然需要,可以在几个小时后发布),但我所做的是在帮助器类中创建一个静态方法'deviceIdentifier'。
该方法对当前iOS版本进行基本检查,如果低于6.0,则返回UDID,否则返回uniqueIdentifier
如果您需要该代码,请告诉我,我会在能够发布的时候把它发布出来...如果我没记错的话,它只有10-15行左右,但会产生很大的差异,因为您只需调用'[myHelper deviceIdentifier]',无论何时都可以获得设备ID,而不必担心使用哪个iOS版本
CFUUIDCreate
)或使用供应商标识符。 - David Rönnqvist