手机多应用通用唯一标识

因公司需要一个手机多应用唯一标识,所以查找了一些资料,然后总结了一下各种方法。

大概写了一些常用于手机唯一标识的一些方法,看完后可对比一下,看哪些比较适合需求!

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);

}

钥匙串共享

手机多应用通用唯一标识_第1张图片

到此,我们需要在共享的APP上按以上流程写一遍,这样就可以成功定义多个应用唯一的标识了!

GIKeychain下载地址

http://pan.baidu.com/s/1bp887yJ

注意:钥匙串中共享只支持team间的APP共享,不支持与其他team的APP之间共享!

你可能感兴趣的:(手机多应用通用唯一标识)