获取唯一UUID/UDID的方案

来源:互联网 发布:广联达软件安装教程 编辑:程序博客网 时间:2024/06/06 04:26

如何保证获取到的UUID能够唯一标识每一台设备呢?我们知道通过UIDevice可以获取到UUIDString,但是如果App被删除了然后重新安装,就会得到不同的UUIDString,这并不是我们希望的。

在同一设备上运行来源于同一开发商的App,获取到的UUIDString属性是同一个值。当在同一设备上运行来源于不同的开发商的App,所获取到的UUIDString是不同的。在不同的设备上,不管是否同属于同一个开发商,得到的UUIDString都会不同。

当设备重启后,若用户第一次未解锁设备,而app在后台运行时,这个UUIDString可能为nil。如果值为nil,请等待并在稍候重新获取。

当app或者另外来源于同一开发商的app被安装到同一设备上,这个UUIDString会保持一致(比如上面的小例子,打印出来就是一致的)。当用户删除掉设备上所有同一开发商的app后,重新安装其中某一个app,这时候所获取到的UUIDString就会发生变化。因此,不管app存储将这个UUID存储到哪里,你都应该手动处理这种改变。

那么如何解决这种改变呢?

解决方案就是能所生成的UUIDString存储到KeyChain中,使用同一个access group、同一个identifier。每次获取UUID,都先从KeyChain中获取,若为空,则通过UIDevice获取UUIDString并存储到KeyChaing,

代码版本如下:

  1. + (NSString *)UUID {
  2. //MARK:此处的 @"5CKSJSE23P.com.haodf.mainGroup" 字串不能动,否则会导致获取的值错误或者 nil
  3. KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"HuangyibiaoAppID" accessGroup:@"com.huangyibiao.test.group"];
  4. NSString *UUID = [wrapper objectForKey:(__bridge id)kSecValueData];
  5. if (UUID.length == 0) {
  6. UUID = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
  7. [wrapper setObject:UUID forKey:(__bridge id)kSecValueData];
  8. }
  9. return UUID;
  10. }



0 0
原创粉丝点击