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获取设备唯一标识码

    今天玩着应用突然想起了这个问题,之前对设备的唯一标识的概念停留在“刷优惠券”的理解上。。。“刷优惠券”就是刷美团或...

  • 获取IOS唯一设备标识码

    最开始使用的是苹果官方KeychainItemWrapper,下载地址为https://developer.app...

  • iOS获取设备的唯一标识的方法总结以及最好的方法

    原文iOS获取设备的唯一标识的方法总结以及最好的方法iOS获取设备的唯一标识的方法总结 各种获取设备唯一标识的方法...

  • 获取android唯一标识

    这是收集几篇关于android唯一标识的老文章,合并一下并添加标注以后查询方便 获取Android设备唯一标识码 ...

  • 2019-06-11

    iOS获取设备唯一标识 获取iOS唯一设备标识的方式有很多。以下列举我知道的几种方式 1、UDID 这个获取方式已...

  • iOS 设备唯一标识码

    前言 昨天有个小伙伴问我怎么去做设备的唯一标示码,就像之前的糯米一样,不论卸载了还是怎么的,都会记住你这个手机。给...

  • 获取Android设备唯一标识码

    链接地址:http://www.cnblogs.com/lvcha/p/3721091.html DEVICE_I...

  • 获取Android设备唯一标识码

    概述 有时需要对用户设备进行标识,所以希望能够得到一个稳定可靠并且唯一的识别码。虽然Android系统中提供了这样...

  • iOS获取设备型号和App版本号等信息(OC+Swift)

    获取设备名称 获取系统版本号 获取设备唯一标识符 获取设备的型号 获取App相关的信息 iOS获取具体设备型号OC...

  • WireShark-iOS真机抓包

    WireShark抓包流程 获取iOS设备UDID(设备唯一标示) 1、打开iTools,点击更多 2、获取设备标...

网友评论

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

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