[转] iOS7如何获取设备惟一标识

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的用法:

/** 初始化一个保存用户账号的KeychainItemWrapper */
KeychainItemWrapper  *wrapper  =  [ [KeychainItemWrapper alloc ] initWithIdentifier :@ "Account Number"
                                                                   accessGroup :@ "YOUR_APP_ID_HERE.com.yourcompany.AppIdentifier" ] ;  
 
//保存数据
[wrapper setObject :@ "<账号>" forKey : (id )kSecAttrAccount ] ;    
 
[wrapper setObject :@ "<账号密码>" forKey : (id )kSecValueData ] ;    
 
//从keychain里取出账号密码
NSString  *password  =  [wrapper objectForKey : (id )kSecValueData ] ;      
 
//清空设置
[wrapper resetKeychainItem ] ;

其中方法“- (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 allocinitWithIdentifier:@"xxxxxx" accessGroup:nil];//xxxx 自定义


保存

[keyWrapper setObject:@"myChainValues" forKey:(id)kSecAttrService];

[keyWrapper setObject:[usernameTextField textforKey:(id)kSecAttrAccount];// 上面两行用来标识一个Item

[keyWrapper setObject:[passwordTextField textforKey:(id)kSecValueData];



读取

[usernameTextField setText:[keyWrapper  objectForKey:(id)kSecAttrAccount]];

[passwordTextField setText:[keyWrapper objectForKey:(id)kSecValueData]]; 

相关文章
相关标签/搜索