WWDC 2013已经闭幕,IOS7 Beta随即发布,界面之难看无以言表...,简直就是山寨Android。css
更让IOS程序猿悲催的是,设备惟一标识的MAC Address在IOS7中也失效了。html
IOS系统中,获取设备惟一标识的方法有不少:ios
一.UDID(Unique Device Identifier)安全
UDID的全称是Unique Device Identifier,顾名思义,它就是苹果IOS设备的惟一识别码,它由40个字符的字母和数字组成。app
二.UUID(Universally Unique Identifier) ide
UUID是Universally Unique Identifier的缩写,中文意思是通用惟一识别码.工具
三.MAC Address测试
四.OPEN UDIDui
五.广告标示符(IDFA-identifierForIdentifier)url
六.Vindor标示符 (IDFV-identifierForVendor)
Vendor是CFBundleIdentifier(反转DNS格式)的前两部分。来自同一个运营商的应用运行在同一个设备上,此属性的值是相同的;不一样的运营商应用运行在同一个设备上值不一样。
经测试,只要设备上有一个tencent的app,从新安装后的identifierForVendor值不变,若是tencent的app所有删除,从新安装后的identifierForVendor值改变。
可是很不幸,上面全部这些表示设备惟一号的标识,在IOS7中要么被禁止使用,要么从新安装程序后两次获取的标识符不同。
因为IOS系统存储的数据都是在sandBox里面,一旦删除App,sandBox也不复存在。好在有一个例外,那就是keychain(钥匙串)。
一般状况下,IOS系统用NSUserDefaults存储数据信息,可是对于一些私密信息,好比密码、证书等等,就须要使用更为安全的keychain了。
keychain里保存的信息不会因App被删除而丢失。因此,能够利用这个keychain这个特色来保存设备惟一标识。
那么,如何在应用里使用使用keyChain呢,咱们须要导入Security.framework ,keychain的操做接口声明在头文件SecItem.h里。
直接使用SecItem.h里方法操做keychain,须要写的代码较为复杂,咱们可使用已经封装好了的工具类KeychainItemWrapper来对keychain进行操做。
KeychainItemWrapper是apple官方例子“GenericKeychain”里一个访问keychain经常使用操做的封装类,在官网上下载了GenericKeychain项目后,
只须要把“KeychainItemWrapper.h”和“KeychainItemWrapper.m”拷贝到咱们项目,并导入Security.framework 。KeychainItemWrapper的用法:
其中方法“- (void)setObject:(id)inObject forKey:(id)key;”里参数“forKey”的值应该是Security.framework 里头文件“SecItem.h”里定义好的key,用其余字符串作key程序会出错!
源: http://blog.csdn.net/zhao19861029/article/details/754229
另外:
戳GenericKeychain去苹果官网下载例子以及KeychainItemWrapper源文件。
KeychainItemWrapper *keychain=[[KeychainItemWrapper alloc] initWithIdentifier:@"xxxxxx" accessGroup:nil];//xxxx 自定义
保存
[keyWrapper setObject:@"myChainValues" forKey:(id)kSecAttrService];
[keyWrapper setObject:[usernameTextField text] forKey:(id)kSecAttrAccount];// 上面两行用来标识一个Item
[keyWrapper setObject:[passwordTextField text] forKey:(id)kSecValueData];
读取
[usernameTextField setText:[keyWrapper objectForKey:(id)kSecAttrAccount]];
[passwordTextField setText:[keyWrapper objectForKey:(id)kSecValueData]];