关于UDID和UUID的区别
一.UDID(Unique Device Identifier)

UDID是Unique Device Identifier的缩写,中文意思是设备唯一标识.

在很多需要限制一台设备一个账号的应用中经常会用到,在Symbian时代,我们是使用IMEI作为设备的唯一标识的,可惜的是Apple官方不允许开发者获得设备的IMEI.

iOS5 sdk中的获取方法:[UIDevice currentDevice] uniqueIdentifier]

uniqueIdentifier在UIDevice.h中的定义如下:@property(nonatomic,readonly,retain) NSString *uniqueIdentifier __OSX_AVAILABLE_BUT_DEPRECATED(__MAC意思是iOS2.0以上及iOS5.0以下的系统可用,但不建议使用.Apple有可能在iOS5.0之后删除该函数.

iOS6之后 换成 [[UIDevice currentDevice] identifierForVendor];

但是我们需要注意的一点是,对于已越狱了的设备,UDID并不是唯一的.使用Cydia插件UDIDFaker,可以为每一个应用分配不同的UDID.

所以UDID作为标识唯一设备的用途已经不大了

二.UUID(Universally Unique Identifier)

UUID是Universally Unique Identifier的缩写,中文意思是通用唯一识别码.

由网上资料显示,UUID是一个软件建构的标准,也是被开源软件基金会(Open Software Foundation,OSF)的组织在分布式计算环境(Distributed Computing Environment,DCE)领域的一部份.UUID的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定.

根据以上定义可知,同一设备上的不同应用的UUID是互斥的,即能在该设备上标识应用.但是并没有明确指出能标识出装有同一应用的不同设备,但是根据我推测,这个UUID应该是根据设备标识和应用标识生成唯一标识,再经过加密而来的(纯推测).

三.

UUID(Universally UniqueIDentifier)

是基于iOS设备上面某个单个的应用程序,只要用户没有完全删除应用程序,则这个UUID在用户使用该应用程序的时候一直保持不变。如果用户删除了这个应用程序,然后再重新安装,那么这个UUID已经发生了改变。通过调用[[UIDevice currentDevice]identifierForVendor];方法可以获取UUID。UUID不好的地方就是用户删除了你开发的程序以后,基本上你就不可能获取之前的数据了。

UDID(Unique Device Identifier)是一串由40位16进制数组成的字符串,用以标识唯一的设备,现在想通过代码获取是不可能的了,如果你想看看你设备的UDID,可以通过iTunes来查看。苹果从iOS5开始就移除了通过代码访问UDID的权限,所以码农啊,想知道用户设备的UDID,是不行的喽。

那么有没有另外的办法来获取用户设备的唯一标识符呢?答案是有的,当然这样的标识符不是苹果隐藏的UDID了,使用OpenUDID开源代码,这个代码通过一些特殊的算法,创建了每一个设备的唯一标识符,你可以拿过来用来识别设备了。

转载:http://blog.sina.com.cn/s/blog_5971cdd00102vqgy.html
UDID被弃用,使用UUID来作为设备的唯一标识。获取到UUID后,如果用NSUserDefaults存储,当程序被卸载后重装时,再获得的UUID和之前就不同了。使用keychain存储可以保证程序卸载重装时,UUID不变。但当刷机或者升级系统后,UUID还是会改变的。但这仍是目前为止最佳的解决办法了,如果有更好的解决办法,欢迎留言。

1.新建一个工程,看一下自己的Bundle Id.这个Bundle Id 要和你用真机测试时的证书上面的Bundle Id相匹配。

2.Target - Capabilities - Keychain Sharing - ON

这步主要目的是打开Keychain Sharing,将它由灰色状态的OFF改为蓝色状态的ON。
打开之后的变化如下:

左侧的目录会自动生成Entitlements文件,不需要自己创建了。

也就是说,Bundle Identifier、Keychain Sharing的Keychain Groups、Entitlements文件的Keychain Access Groups的第一个元素,它们要保持上图所示的一致性。
设置好了以后可以运行下程序,没问题可以进行下一步。

3.传说中的uuid类和keychain类来啦
既然苹果的keychain方法会崩溃而且有些复杂,我们只保存一个uuid的话可以用下面的简单方法:
(这也是我自己百度的keychain拷贝别人的,然后改改)

UUID.h
#import  尖括号(Foundation/Foundation.h)@interface UUID : NSObject+(NSString *)getUUID;@endUUID.m#import "UUID.h"
#import "KeyChainStore.h"@implementation UUID+(NSString *)getUUID
{NSString * strUUID = (NSString *)[KeyChainStore load:@"com.company.app.usernamepassword"];//首次执行该方法时,uuid为空if ([strUUID isEqualToString:@""] || !strUUID){//生成一个uuid的方法CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);strUUID = (NSString *)CFBridgingRelease(CFUUIDCreateString (kCFAllocatorDefault,uuidRef));//将该uuid保存到keychain[KeyChainStore save:KEY_USERNAME_PASSWORD data:strUUID];}return strUUID;
}@endKeyChainStore.h#import 尖括号(Foundation/Foundation.h)@interface KeyChainStore : NSObject+ (void)save:(NSString *)service data:(id)data;
+ (id)load:(NSString *)service;
+ (void)deleteKeyData:(NSString *)service;@endKeyChainStore.m
#import "KeyChainStore.h"@implementation KeyChainStore+ (NSMutableDictionary *)getKeychainQuery:(NSString *)service {return [NSMutableDictionary dictionaryWithObjectsAndKeys:(id)kSecClassGenericPassword,(id)kSecClass,service, (id)kSecAttrService,service, (id)kSecAttrAccount,(id)kSecAttrAccessibleAfterFirstUnlock,(id)kSecAttrAccessible,nil];
}+ (void)save:(NSString *)service data:(id)data {//Get search dictionaryNSMutableDictionary *keychainQuery = [self getKeychainQuery:service];//Delete old item before add new itemSecItemDelete((CFDictionaryRef)keychainQuery);//Add new object to search dictionary(Attention:the data format)[keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(id)kSecValueData];//Add item to keychain with the search dictionarySecItemAdd((CFDictionaryRef)keychainQuery, NULL);
}+ (id)load:(NSString *)service {id ret = nil;NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];//Configure the search setting//Since in our simple case we are expecting only a single attribute to be returned (the password) we can set the attribute kSecReturnData to kCFBooleanTrue[keychainQuery setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData];[keychainQuery setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit];CFDataRef keyData = NULL;if (SecItemCopyMatching((CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {@try {ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData *)keyData];} @catch (NSException *e) {NSLog(@"Unarchive of %@ failed: %@", service, e);} @finally {}}if (keyData)CFRelease(keyData);return ret;
}+ (void)deleteKeyData:(NSString *)service {NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];SecItemDelete((CFDictionaryRef)keychainQuery);
}@end

将这两个类添加到工程中

4.新建一个pch文件,然后pch文件的内容如下:

#ifndef PrefixHeader_pch
#define PrefixHeader_pch#define  KEY_USERNAME_PASSWORD @"com.company.app.usernamepassword"
#define  KEY_USERNAME @"com.company.app.username"
#define  KEY_PASSWORD @"com.company.app.password"#endif

pch文件的创建方法可参考:http://blog.csdn.net/huang2009303513/article/details/40375235
你有可能会在填Prefix Header 即pch文件的路径那里报错,最近又学习到一种更好的方式(SRCROOT)/(SRCROOT)/(PROJECT_NAME)/PrefixHeader.pch,其中$(PROJECT_NAME)是相对工程名,比上面的方法更便捷.

5.在viewcontroller.m里面执行如下代码
NSString * uuid= [UUID getUUID];
NSLog(@”uuid=%@”,uuid);
得到的uuid类似于这种
uuid=19AAB430-9CB8-4325-ACC5-D7D386B68960

然后卸载掉,再重新运行,看前后得到的uuid是不是一样吧

iOS获取UUID,并使用keychain存储,可用于封设备相关推荐

  1. (绝对有用)iOS获取UUID,并使用keychain存储

    原文链接 http://blog.sina.com.cn/s/blog_5971cdd00102vqgy.html UDID被弃用,使用UUID来作为设备的唯一标识.获取到UUID后,如果用NSUse ...

  2. ios获取UUID的方法

    方法一:直接在手机上查看 打开网址:https://www.pgyer.com/udid,如果是在微信里打开,点击右上角按钮,在Safari打开 每个iPhoe设备都有一个唯一的设备标识符UUID,由 ...

  3. iOS小技能:设备ID除了使用_idfa、_idfv 还可使用其他替代方案(使用Keychain 存储UUID)

    文章目录 前言 I 如何唯一标识一台iOS设备? 1.1 通过Safari浏览器获取iOS设备UDID(设备唯一标识符) 1.2 替代方案:使用Keychain 存储UUID 1.3 最佳实践:`优先 ...

  4. iOS - 获取设备标识符UUID/UDID/IMEI等

    关于获取设备各种标识符,最近整理了一下.基本上有IDFA.IDFV.IMEI.IMSI.UUID.UDID.MAC地址; 想要获取系统唯一标识符的话,比如说不管用户卸载还是重新安装都可以唯一标识的可以 ...

  5. iOS获取手机唯一标识符来判断不同终端登录(IDFA和UUID分析)

    11.13更新 广告标示符,适用于对外:例如广告推广,换量等跨应用的用户追踪等. 是iOS 6中另外一个新的方法,提供了一个方法advertisingIdentifier,通过调用该方法会返回一个NS ...

  6. html5 ios keychain,iOS 用keychain钥匙串保存账号、设备UUID及APP间共享

    iOS的keychain服务提供了一种安全的保存私密信息(密码,序列号,证书等)的方式,每个ios程序都有一个独立的keychain存储.相对于NSUserDefaults.文件保存等一般方式,key ...

  7. iOS获取设备ID总结

    UDID 简介:UDID的全称是Unique Device Identifier,顾名思义,它就是苹果IOS设备的唯一识别码,它由40个字符的字母和数字组成.在很多需要限制一台设备一个账号的应用中经常 ...

  8. iOS获取设备的唯一标识的方法总结以及最好的方法

    各种获取设备唯一标识的方法介绍 一.UDID(Unique Device Identifier) UDID的全称是Unique Device Identifier,它就是苹果iOS设备的唯一识别码,它 ...

  9. iOS获取设备的唯一标识的方法

    各种获取设备唯一标识的方法介绍 一.UDID(Unique Device Identifier) UDID的全称是Unique Device Identifier,它就是苹果iOS设备的唯一识别码,它 ...

  10. iOS获取设备唯一标识

    前言 目前市面应用普遍采用用户体验,涉及到部分重要功能时候才提醒用户注册账户,而用户之前的操作,比如收藏,点赞,关注等内容需要同时关联进注册的账户,那么根据什么记录用户的操作信息就尤为重要.下面就列出 ...

最新文章

  1. PHP 获取数组最后一个值
  2. 评价对象检测模型的数字度量:F1分数以及它们如何帮助评估模型的表现
  3. mysql主从复制运维_Mysql主从复制配置
  4. jmeter找不到java.dll_Windows下Jmeter安装出现Not able to find Java executable or version问题解决方案...
  5. java多线程论文_Java5 多线程之入门篇-论文
  6. php如何接入微信支付接口,PHP实现微信支付(jsapi支付)流程的方法
  7. Python random模块sample、randint、shuffle、choice随机函数
  8. Confluence 6 PostgreSQL 输入你的数据库细节
  9. Java(面向对象OOP)
  10. 无法启动此程序因为计算机中丢失d3dx,无法启动此程序,因此计算机中丢失d3dx9-41.dll怎么解决?...
  11. Java最准确的获取当前一周开始时间和结束时间
  12. Model性能相关操作:select_related
  13. 腾讯2020校园招聘笔试题解
  14. 2017146期计算机开机号,[彩吧]福彩3D17147期开机号103
  15. 【MWC 2022观察】华为绿色智简全光网:让联接释放数字化转型新动能
  16. github不小心同步覆盖了本地文件
  17. 国家天地图API 创建面 覆盖物
  18. 垃圾邮件识别-朴素贝叶斯算法
  19. c++倒序输出一个四位整数
  20. 最强大脑魔方墙模拟程序(工具)

热门文章

  1. 购物中心最好的无线AP是什么?
  2. 【控制篇 / 策略】(5.4) ❀ 03. Explicit Web Proxy 显式web代理 ❀ FortiGate 防火墙
  3. 【Luat-esp32c3】4.3 文件系统——加载jpeg图片并拆包
  4. PHPFOG提供100M免费PHP空间
  5. 五款超级易用的网络监控软件
  6. 微软阿根廷服务器解锁,XBOX阿根廷服购买教程
  7. 00.设计模式之六大原则
  8. 得到头条【四线城市宜宾,靠什么逆袭?】
  9. ,智商达到140及以上可以称之为天才
  10. 埃隆·马斯克(Elon Musk)