UUID、UDID、Keychain
一、UDID
自从iOS5之后,苹果就禁止了通过代码访问UDID,在这之前,可以使用[[UIDevice cuurrent] uniqueIdenfier] 这个方法来获取某设备UDID,现在是不可能了(因为UDID是设备的唯一标识符,与iOS设备相关,不管App卸载再重装多少次,UDID的值都不会变的)
二、UUID
因为保证对在同一时空中的所有机器都是唯一的,所以在程序安装的时候生成唯一的UUID并且保存在keychain中,以这个唯一的UUID作为唯一标识符,就可以用于判断唯一设备。变相的作为UDID的用法!
XXXApp运行到A设备,产生一个UUID,之后此APP每次运行在A设备产生的UUID均相同!当从A设备卸载XXXApp后,再次下载到A设备,这时产生的UUID就会变化!
正因如此若需要获取一个不变的UUID当UDID来使用,这时开发者想到的就是将UUID,存储到Keychain中,(因为当卸载XXXApp后再重新安装回来,Keychain存储的之前XXXApp信息是不变的)
三、Keychain(钥匙串)
iOS的keychain服务提供了一种安全的保存私密信息(密码,序列号,证书等)的方式,每个ios程序都有一个独立的keychain存储。相对于NSUserDefaults、文件保存等一般方式,keychain保存更为安全,而且keychain里保存的信息不会因App被删除而丢失,所以在重装App后,keychain里的数据还能使用。
如何需要在应用里使用使用keyChain,我们需要导入Security.framework ,keychain的操作接口声明在头文件SecItem.h里。直接使用SecItem.h里方法操作keychain,需要写的代码较为复杂,为减轻咱们程序员的开发,我们可以使用一些已经封装好了的工具类,下面我会简单介绍下我用过的两个工具类:KeychainItemWrapper和SFHFKeychainUtils。(KeychainItemWrapper在GitHub下载地址)
获取用户名和密码
在一般的思路中,第一次登陆成功后,我们将已经验证正确的用户名和密码保存在keychain里,以后每次打开应用,我们就应该从keychain中获取曾经保存的用户名和密码来通过验证而不需要用户再次输入
Keychain使用情况如下:
KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"xxxxxx" accessGroup:nil]; //xxxx 自定义
//保存帐号
[wrapper setObject:@"<帐号>" forKey:(id)kSecAttrAccount];
//保存密码
[wrapper setObject:@"<帐号密码>" forKey:(id)kSecValueData];
//从keychain里取出帐号密码
NSString *password = [wrapper objectForKey:(id)kSecValueData];
//清空设置
[wrapper resetKeychainItem];
另外需要引入Security.framework 和KeychainItemWrapper头文件其中方法“- (void)setObject:(id)inObject forKey:(id)key;”里参数“forKey”的值应该是Security.framework 里头文件“SecItem.h”里定义好的key,用其他字符串做key程序会崩溃!