iOS设备唯一标识符解决方案
记得当时做过一个电商项目,甲方提出的要求是这样的:用户可以在不登录的情况下,以游客模式下单购物,而不被注册or登录打断购物流程。这个技术难点主要是怎么永久保存App的用户数据,要做到用户卸载重装App后,还能识别是哪个用户。
UUID
UUID是Universally Unique Identifier的缩写,中文意思是通用唯一识别码。它是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。这样,每个人都可以建立不与其它人冲突的 UUID。苹果公司建议使用UUID为应用生成唯一标识字符串。 iOS 6中介绍的Vendor或Advertising标示符,通过下面的代码可以获得一个UUID字符串:
如何获取UUID
方法1.
NSString *uuid = [[NSUUID UUID] UUIDString];
也可以保存在iOS 6中新增的Vindor标示符 (IDFV-identifierForVendor),获取这个IDFV的新方法被添加在已有的UIDevice类中。跟advertisingIdentifier一样,该方法返回的是一个NSUUID对象。
方法2.
NSString *uuid = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
方法3.
NSString *uuid = (NSString *)CFBridgingRelease(CFUUIDCreateString (kCFAllocatorDefault,uuidRef));
Keychain
开发者可以在应用第一次启动时调用一次,然后将该串存储起来,以便以后替代UDID来使用。但是,如果用户删除该应用再次安装时,又会生成新的字符串,所以不能保证唯一识别该设备。由于IOS系统存储的数据都是在sandBox里面,一旦删除App,sandBox也不复存在。好在有一个例外,那就是keychain(钥匙串)。通常情况下,IOS系统用NSUserDefaults存储数据信息,但是对于一些私密信息,比如密码、证书等等,就需要使用更为安全的keychain了。
keychain里保存的信息不会因App被删除而丢失。所以,可以利用这个keychain这个特点来保存设备唯一标识。所以这里要用到KeyChain来保存。
那么,如何在应用里使用使用keyChain呢,可以使用第三方库的YYKeychain来实现,我们可以使用苹果已经封装好了的工具类KeychainItemWrapper来对keychain进行操作。
实现
+ (NSString *)getUUID {
NSError *error;
NSString *uuid = [YYKeychain getPasswordForService:@"YouAppleTeamID.com.test.porject"
account:@"UUID"
error:&error];
if (uuid) {
return uuid;
}
if(error){
NSLog(@"从Keychain里获取密码出错:%@", error);
}
//首次执行该方法时,uuid为空
if ([uuid isEqualToString:@""] || !uuid) {
CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);
uuid = (NSString *)CFBridgingRelease(CFUUIDCreateString (kCFAllocatorDefault,uuidRef));
/** 保存用户的密码*/
BOOL saved = [YYKeychain setPassword:uuid forService:@"YouAppleTeamID.com.test.porject" account:@"UUID" error:&error];
if (!saved) {
NSLog(@"保存密码时出错:%@", error);
}
}
return uuid;
}
在首次打开App的时候,会给用户生成一个唯一的UUID并存储在keychain中,当用户卸载App后,重新安装打开后,会从Keychain中获取存储的UUID,这样就能实现用户的唯一标识。