iOS钥匙串(KeyChain)和设备id(uuid)

前言

在开发过程中,我们经常会被要求获取每个设备的唯一标示,以便后台做相应的处理。

一:UUID采用 IDFV

  • 全名:identifierForVendor
    获取代码:
    NSString *idfv = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
    来源:iOS6.0及以后

  • 说明:顾名思义,是给Vendor标识用户用的,每个设备在所属同一个Vender的应用里,都有相同的值。其中的Vender是指应用提供商,但准确点说,是通过BundleID的反转的前两部分进行匹配,如果相同就是同一个Vender,例如对于com.taobao.app1, com.taobao.app2 这两个BundleID来说,就属于同一个Vender,共享同一个idfv的值。和idfa不同的是,idfv的值是一定能取到的,所以非常适合于作为内部用户行为分析的主id,来标识用户,替代OpenUDID。

  • 注意:如果用户将属于此Vender的所有App卸载,则idfv的值会被重置,即再重装此Vender的App,idfv的值和之前不同。

二:钥匙串:Keychain

  • 介绍


  • 钥匙串用途
    我们可以获取到UUID,然后把UUID保存到KeyChain里面。
    这样以后即使APP删了再装回来,也可以从KeyChain中读取回来。使用keyChain Sharing还可以保证同一个开发商(teamID同)的所有程序针对同一台设备能够获取到相同的不变的UDID。但是刷机或重装系统后uuid还是会改变。

  • 苹果官方提供的库
    KeychainItemWrappe 然而很多人说并不好用。

  • 钥匙串bug
    钥匙串我使用的是第三方库SSKeychain,经过长期删除重装软件发现钥匙串访问获取数据并不稳定,存在问题:有时候会获取不到钥匙串中的数据,且这段时间都无法获取。但是过段时间就可以获取了。

三:xcode设置

项目2若要使用项目1的Keychain则项目2要开启Keychain Sharing 且 Keychain Groups要包含项目1。 项目1的Keychain Sharing 没有要求。

项目 1
项目 2

四:代码

使用第三方SSKeychain。

#import <SSKeychain.h>
//获取uuid且保存到钥匙串 卸载过后又安装的话读取钥匙串uuid
+ (NSString*)getUUID{
    NSString * currentDeviceUUIDStr = nil;
    //由于钥匙串有一定概率拿不到uuid,错误原因又很难说,而且拿不到的时候一小段时间都拿不到,所以尽量少用钥匙串拿数据,这里就用了NSUserDefaults减少使用钥匙串。钥匙串只在卸载app后第一次拿uuid使用。
    currentDeviceUUIDStr = [[NSUserDefaults standardUserDefaults]objectForKey:@"uuid"];
    if (TestStringIsBlank(currentDeviceUUIDStr)) {
        currentDeviceUUIDStr = [SSKeychain passwordForService:@"com.baidu.HuaHuaLive" account:@"uuid"];
        if(!TestStringIsBlank(currentDeviceUUIDStr)){
            [[NSUserDefaults standardUserDefaults]setObject:currentDeviceUUIDStr forKey:@"uuid"];
        }
    }
//    NSError *error = nil;
//    while (error) {
//        error = nil;
//        currentDeviceUUIDStr = [SSKeychain passwordForService:@"com.baidu.HuaHuaLive"account:@"uuid" error:&error];
//    }
    if (TestStringIsBlank(currentDeviceUUIDStr))
    {
        /**
         *此uuid在相同的一个程序里面-相同的vindor-相同的设备下是不会改变的
         *此uuid是唯一的,但应用删除再重新安装后会变化,采取的措施是:只获取一次保存在钥匙串中,之后就从钥匙串中获取
         **/
        currentDeviceUUIDStr  = [UIDevice currentDevice].identifierForVendor.UUIDString;
        currentDeviceUUIDStr = [currentDeviceUUIDStr stringByReplacingOccurrencesOfString:@"-" withString:@""];
        currentDeviceUUIDStr = [currentDeviceUUIDStr lowercaseString];
        //若获取不到就手动生成
        if (TestStringIsBlank(currentDeviceUUIDStr)) {
            CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);
            CFStringRef cfuuid = CFUUIDCreateString(kCFAllocatorDefault, uuidRef);
            CFRelease(uuidRef);
            currentDeviceUUIDStr = [((__bridge NSString *) cfuuid) copy];
            currentDeviceUUIDStr = [currentDeviceUUIDStr stringByReplacingOccurrencesOfString:@"-" withString:@""];
            currentDeviceUUIDStr = [currentDeviceUUIDStr lowercaseString];
            CFRelease(cfuuid);
        }
    //password:密码 serviece:应用标识(最好使用bundleID) account:账户名
        [SSKeychain setPassword: currentDeviceUUIDStr forService:@"com.baidu.HuaHuaLive" account:@"uuid"];
        [[NSUserDefaults standardUserDefaults]setObject:currentDeviceUUIDStr forKey:@"uuid"];
    }
    return currentDeviceUUIDStr;
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容