iOS获取设备唯一标识码

作者: 举个栗子wow | 来源:发表于2016-03-25 21:05 被阅读1674次

    今天玩着应用突然想起了这个问题,之前对设备的唯一标识的概念停留在“刷优惠券”的理解上。。。
    “刷优惠券”就是刷美团或者大众这些做首单优惠的App的优惠券,它们为“首单”创造了几个制约因素,其中一个就是设备的唯一性——参加过的不能再参加,这就要获取的设备的唯一标识。这项技能一度使我在大学里吃牛排看电影不要钱。
    有点跑题,回到正题上。我查阅了一些资料,了解了一下iOS下是如何做到“设备标识的唯一性的”。不得不说iOS在用户隐私政策和权限上做的非常好,一个App能获得的权限(没越狱的情况下)是非常有限的,之前的很多方法比如UDID都被弃用禁止了。
    那么就说现在还能用的,现在常用的是用UUID + keychain结合来实现这个需求。

    UUID是Universally Unique Identifier的缩写,中文意思是通用唯一识别码。它是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。这样,每个人都可以建立不与其它人冲突的 UUID。在此情况下,就不需考虑数据库建立时的名称重复问题。苹果公司建议使用UUID为应用生成唯一标识字符串。

    首先我们要获取一个UUID,方法如下:

    - (NSString*)uuid {
        CFUUIDRef uuid = CFUUIDCreate( nil );
        CFStringRef uuidString = CFUUIDCreateString( nil, uuid );
        NSString * result = (NSString *)CFBridgingRelease(CFStringCreateCopy( NULL, uuidString));
        CFRelease(uuid);
        CFRelease(uuidString);
        return result;
    }
    

    现在我们获取到了一个UUID,虽然这个标识是唯一的,但是这样还是无法保证每一次的唯一性,因为当你每次调用这个方法或者把应用卸载了,UUID会重新生成一个不同的。这个时候keychain就起到了作用。所以整个逻辑是这样的:先从keychain取UUID,如果能取到,就用这个比对,如果取不到就重新生成一个保存起来。keychain独立在App之外,是和系统统一等级的,所以你不用担心它挂掉。

    keychain是苹果公司Mac OS中的密码管理系统。它在Mac OS 8.6中被导入,并且包括在了所有后续的Mac OS版本中,包括Mac OS X。一个钥匙串可以包含多种类型的数据:密码(包括网站,FTP服务器,SSH帐户,网络共享,无线网络,群组软件,加密磁盘镜像等),私钥,电子证书和加密笔记等。iOS端同样有个keychain帮助我们管理这些敏感信息。

    使用过keychain保存过账号密码的童鞋应该对这个工具非常了解,在这里不做过多解释。使用keychain需要导入Security.frameworkKeychainItemWrapper.h/.mKeychainItemWrapper.h/.m搜一下可以下载下来,拖入工程中。保存UUID代码如下:

    - (void)saveUuidWithKeyChain {
        KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc]
                                             initWithIdentifier:@"UUID" accessGroup:@"com.QiuYunxiang.www"];
        NSString *strUUID = [keychainItem objectForKey:(id)kSecValueData];
        if (strUUID == nil || [strUUID isEqualToString:@""])
        {
            [keychainItem setObject:[self uuid] forKey:(id)kSecValueData];
        }
    }
    

    注:这个方法中accessGroup:这个参数如果一些App设置相同的话,是可以共享的。

    从keychain获取UUID的方法如下:

    - (NSString *)getKeychain {
        KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc]
                                             initWithIdentifier:@"UUID" accessGroup:@"com.QiuYunxiang.com"];
        NSString *strUUID = [keychainItem objectForKey:(id)kSecValueData];
        return strUUID;
    }
    

    至此,基本上唯一标识的几个方法算是写完了,大家可以测试一下,卸载应用再重新装,从keychain读取的UUID还是和之前一样。

    但这里有个不确定因素,就是手机系统恢复出厂设置或者抹掉所有数据的话,这个方法也可能不起作用了,因为它是依靠钥匙串在生存,钥匙串挂掉的话它也就失效了。

    献给以前刷优惠券的日子
    

    个人原创,转载请注明出处,谢谢。

    相关文章

      网友评论

        本文标题:iOS获取设备唯一标识码

        本文链接:https://www.haomeiwen.com/subject/mcldlttx.html