因公司需要一个手机多应用唯一标识,所以查找了一些资料,然后总结了一下各种方法。
大概写了一些常用于手机唯一标识的一些方法,看完后可对比一下,看哪些比较适合需求!
1.UDID
是苹果IOS设备的唯一识别码,它由40个字符的字母和数字组成。每台iOS设备的UDID是唯一且永远不会改变,ios7中已经完全禁用了,现在已经获取不到UDID了。
2. Mac地址
IOS7之后mac地址返回的值已经固定,不能作为唯一标识符了。
3.供应商标示符(IDFV)
identifierForVendor对供应商来说是唯一的一个值,也就是说,由同一个公司发行的的app在相同的设备上运行的时候都会有这个相同的标识符。然而,如果用户删除了这个供应商的app然后再重新安装的话,这个标识符就会不一致。
4.OpenUDID
原理是利用iOS系统中的UIPasteboard剪贴板类,iOS7.0以前iOS是所有的应用都可以共享同一个剪贴板存储内容,但是iOS7之后只有在同一CFBundleIdentifier标识下的App才能共享内容。
5.UUID
UUID是Universally Unique Identifier的缩写,每次获取的值都不相同,但每个值都是唯一的,可以选择存入keychain存储,实现keychain数据共享的话,可以作为多应用的唯一标识
6. 广告标示符(IDFA)
主要用于广告,可能会获取不到,iOS用户也可以 设置|隐私|广告追踪 里重置此id的值,不适用作为手机唯一标识
钥匙串多应用数据共享
钥匙串里的值并不随着客户删除应用就删除了,这样为我们跨APP唯一标识提供了一个很好的方法。
我们只需要创建一个UUID,保存到钥匙串中,在程序中把钥匙串数据共享打开,加入我们需要分享的APP的bundle identifier,这样我们只要在每个APP中判断UUID是否存在,存在的话直接拿来用,不存在的话,创建一个UUID存到钥匙串,这样就可以做成一个多应用间唯一标识。
1.下面是大概的流程
获取UUID
+(NSString*)UUID
{
CFUUIDRefpuuid=CFUUIDCreate(nil);
CFStringRefuuidString=CFUUIDCreateString(nil,puuid);
NSString*result=(NSString*)CFBridgingRelease(CFStringCreateCopy(NULL,uuidString));
CFRelease(puuid);
CFRelease(uuidString);
NSLog(@"uuid=%@",result);
returnresult;
}
钥匙串方法与共享
查看是否有UUID,有就用,没有的话就添加UUID
NSString*accountKey=@"user_token_sharing";
NSString*accountName=@"Citics";
if([GIKeychaingetKeychainDataForKey:accountKey]) {
NSLog(@"该key内容已经存在,为:%@",[GIKeychaingetKeychainDataForKey:accountKey]);
}else{
NSLog(@"该key不存在,准备写入");
[GIKeychainaddKeychainData:accountNameforKey:accountKey];
NSLog(@"已写入,该key内容:%@",[GIKeychaingetKeychainDataForKey:accountKey]);
}
钥匙串获取UUID
+(id)getKeychainDataForKey:(NSString*)key{
idret=nil;
NSMutableDictionary*keychainQuery=[selfgetKeychainQuery:key];
//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
[keychainQuerysetObject:(id)kCFBooleanTrueforKey:(__bridgeid)kSecReturnData];
[keychainQuerysetObject:(__bridgeid)kSecMatchLimitOneforKey:(__bridgeid)kSecMatchLimit];
CFDataRefkeyData=NULL;
if(SecItemCopyMatching((__bridgeCFDictionaryRef)keychainQuery, (CFTypeRef*)&keyData)==noErr) {
@try{
ret=[NSKeyedUnarchiverunarchiveObjectWithData:(__bridgeNSData*)keyData];
}@catch(NSException*e) {
NSLog(@"Unarchive of %@ failed: %@",key,e);
}@finally{
}
}
if(keyData)
CFRelease(keyData);
returnret;
}
钥匙串添加UUID
+(void)addKeychainData:(id)dataforKey:(NSString*)key{
//Get search dictionary
NSMutableDictionary*keychainQuery=[selfgetKeychainQuery:key];
//Delete old item before add new item
SecItemDelete((__bridgeCFDictionaryRef)keychainQuery);
//Add new object to search dictionary(Attention:the data format)
[keychainQuerysetObject:[NSKeyedArchiverarchivedDataWithRootObject:data]forKey:(__bridgeid)kSecValueData];
//Add item to keychain with the search dictionary
SecItemAdd((__bridgeCFDictionaryRef)keychainQuery,NULL);
}
钥匙串共享
到此,我们需要在共享的APP上按以上流程写一遍,这样就可以成功定义多个应用唯一的标识了!
GIKeychain下载地址
http://pan.baidu.com/s/1bp887yJ
注意:钥匙串中共享只支持team间的APP共享,不支持与其他team的APP之间共享!