Iphone 如何生成在所有iOS版本中都可以使用的唯一标识符?
我想获得支持所有iOS版本的唯一标识符。有人能帮我解决这个问题吗。正如您所知,苹果公司不赞成UDID方法,因此有可能使用wifi mac地址生成唯一id。但苹果公司将在iOS7版本中删除wifi mac地址。因此,我的要求是生成一个新的唯一代码,该代码应能在所有iOS版本中运行。提前感谢Iphone 如何生成在所有iOS版本中都可以使用的唯一标识符?,iphone,ios,uniqueidentifier,udid,Iphone,Ios,Uniqueidentifier,Udid,我想获得支持所有iOS版本的唯一标识符。有人能帮我解决这个问题吗。正如您所知,苹果公司不赞成UDID方法,因此有可能使用wifi mac地址生成唯一id。但苹果公司将在iOS7版本中删除wifi mac地址。因此,我的要求是生成一个新的唯一代码,该代码应能在所有iOS版本中运行。提前感谢 注意:一旦用户重新启动设备或重新安装应用程序,请不要更改UDID。我现在没有访问代码的权限,如果您仍然需要,可以在几个小时后发布,但我所做的是在助手类中创建静态方法“deviceIdentifier” 该方法对
注意:一旦用户重新启动设备或重新安装应用程序,请不要更改UDID。我现在没有访问代码的权限,如果您仍然需要,可以在几个小时后发布,但我所做的是在助手类中创建静态方法“deviceIdentifier” 该方法对当前iOS版本进行基本检查,如果低于6.0,则返回UDID,否则返回uniqueIdentifier
请告诉我您是否需要该代码,我会在可能的时候发布。如果我没记错的话,它只有10-15行左右,但是会有很大的不同,因为您可以调用“[myHelper deviceIdentifier]'只要您需要设备ID,就不必担心他们使用的是哪个iOS版本。现在,设备标识符将更改为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版本中都可以工作。我正在更新我的应用程序,该应用程序仅基于支持iOS 4.3及以上版本的唯一标识符工作。所以 1我无法使用[UIDevice currentDevice]。唯一标识符;因为已经没有了 2我无法使用[UIDevice currentDevice].identifierForVendor.UUIString,因为它仅在iOS 6.0及更高版本中可用,并且无法用于较低的iOS版本 3由于在iOS-7中不允许mac地址,因此它不是一个选项 4是一段时间以前的事了,而且iOS-6也有问题 iOS-5及以下版本也没有5个广告标识符 最后我就是这么做的 项目中添加了一个 b生成的CFUUID密钥字符串
CFUUIDRef cfuuid = CFUUIDCreate(kCFAllocatorDefault);
udidString = (NSString*)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, cfuuid));
c将其保存到Key-Chain Utils,否则每次都会生成一个新的Unique
最终代码
非常感谢您的快速信息。。正如您所知,apple不赞成UDID方法,因此我实现了使用Mac地址生成唯一标识符。但苹果公司将在iOS7版本中删除wifi mac地址。因此,我需要生成一个新的唯一代码,该代码应能在包括iOS7在内的所有版本中运行。请分享您的逻辑,这将对我有很大帮助。。再次感谢..嗨,Gahesh-我仔细检查了我的代码,记得我从那里完全取出了供应商代码的预标识,只是为了确保符合苹果的指导方针,我认为他们对在新应用程序中使用UDID的人非常严格,即使只是为了支持旧版本的iiOSSo,我也只是使用供应商的标识,我知道它不能满足您的要求,即即使在应用程序卸载中它也必须保持不变Hi James,idenetifierForVendor可从iOS 6获得。但使用它我们可以支持iOS6或更高版本的设备。这里我的问题是如何支持更低版本。我坚信有一个解决办法。让我们拭目以待:是的,一旦重新安装应用程序,UDID就会被更改。这个逻辑不能完全满足我的要求。不管怎样,谢谢你的逻辑。他们拒绝使用这种独特的ID是有原因的。创建并存储您自己的UUID CFUUID创建或使用供应商标识谢谢。请注意,SFHFKeychainUtils的创建者说,它应该被视为不推荐使用,而应该使用他的STUtils。此外,还应添加CFReleasecfuuid;使用上面的GetDeviceID方法来防止内存泄漏。@ghr。是的,他说不管我如何使用它,它都应该被认为是不推荐的。在许多应用中没有ay问题。再次感谢我不知何故跳过了。@NSQuamber.java,卸载应用程序后是否会更改生成的id?我有一个要求,即id必须是唯一的,并将发送到服务器。即使用户卸载/重新安装应用程序,我也应该具有相同的id。您的解决方案是否可能实现这一点?另外,它对iOS 8.4仍然有效吗?感觉苹果讨厌开发者-@shamaleyte你能测试这个吗?我还需要获取设备的唯一标识符,该标识符在重新安装应用程序后不会更改
+ (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;
}