IMEI 、UDID、IDFA 、IDFV 、UUID

参考:


总结

目前最佳获取设备的唯一标识方案:UUID+keychain


IMEI

苹果已经不允许APP获取IMEI,在:设置-通用-关于本机中可以查看到IMEI。


UDID

这种方式需要使用私有API,不建议使用这个咯


IDFA和IDFV

  • IDFA:广告标识符
  • IDFV:APP 提供商 标识符

IDFA和IDFV都可以通过系统API获取到一个NSUUID对象,二者都是6.0开始使用。


IDFA

获取方式:

#import <AdSupport/AdSupport.h>
NSString *idfa = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
官方文档

An alphanumeric string unique to each device, used only for serving advertisements.
Unlike the identifierForVendor property of the UIDevice, the same value is returned to all vendors. This identifier may change—for example, if the user erases the device—so you should not cache it.每个设备唯一的字母数字字符串,仅用于提供广告。
与UIDevice的identifierForVendor属性不同,相同的值返回给所有供应商。这个标识符可能会改变——例如,如果用户擦除设备——所以您不应该缓存它。

In iOS 10.0 and later, the value of advertisingIdentifier is all zeroes when the user has limited ad tracking.
If the value is nil, wait and get the value again later. This happens, for example, after the device has been restarted but before the user has unlocked the device.
在iOS 10.0及以后版本中,当用户限制广告跟踪时,advertisingIdentifier的值都是0。如果值为nil,则等待并稍后再次获取该值。例如,这发生在设备重启之后,但在用户解锁设备之前。

从官方文档可总结出:

  • 同个供应商,同一个设备,值相同。
  • 用户限制广告跟踪,iOS10以上,返回的值都为0,如:00000000-0000-0000-0000-000000000000
  • 用户重新关闭限制广告跟踪,值会改变。

可重置,可限制:

  • 1、手动重置(设置 -> 通用 -> 还原 -> 还原所有设置、还原位置与隐私)
  • 2、重置系统
  • 3、设置 - 隐私 - 广告 - 限制广告跟踪

对于IDFA的使用,在提审的时候,也要注意相关选项的勾选:

image

IDFV

官方文档

NSUUID *idfv = [UIDevice currentDevice].identifierForVendor;
NSLog(@"%@",idfv);

The value of this property is the same for apps that come from the same vendor running on the same device. A different value is returned for apps on the same device that come from different vendors, and for apps on different devices regardless of vendor.
对于来自运行在相同设备上的相同供应商的应用程序,此属性的值是相同的。对于来自不同厂商的同一设备上的应用程序,以及对于来自不同厂商的不同设备上的应用程序,将返回不同的值。

If the value is nil, wait and get the value again later. This happens, for example, after the device has been restarted but before the user has unlocked the device.
如果值为nil,则等待并稍后再次获取该值。例如,这发生在设备重启之后,但在用户解锁设备之前。

The value changes when the user deletes all of that vendor’s apps from the device and subsequently reinstalls one or more of them. The value can also change when installing test builds using Xcode or when installing an app on a device using ad-hoc distribution. Therefore, if your app stores the value of this property anywhere, you should gracefully handle situations where the identifier changes.
当用户从设备上删除该供应商的所有应用程序并随后重新安装其中一个或多个应用程序时,该值将发生变化。在使用Xcode安装测试构建时,或者在使用特别发行版在设备上安装应用程序时,该值也可以更改。因此,如果您的应用程序在任何地方存储此属性的值,那么您应该优雅地处理标识符更改的情况。

从官方文档可以获得如下的要点:

  • 来自同一个提供商的APP运行在同一个设备上,不同APP获取该值相同。
  • 来自不同的提供商的不同APP,不管是不是同一个设备上,该值都不同。
  • 同一个设备上,删除了该提供商的所有APP,再次安装该提供商的其中一个或者多个APP,值会改变。
  • 如果获取到该值为nil,等待并稍后再获取该值。这种情况发生在用户重启设备并解锁之前。
  • 如果用户使用xcode或者ad-hoc企业证书分发的安装的情况,值也可能改变,因此,应该优雅的缓存该值。(如何缓存?keychain)

供应商区分

为什么主要是由于提供商的来区分呢?因为这个值就是根据提供商的不用来生成的(包名 bundle identifier)。
如何区分是否是同一个提供商?其实就是看包名。
包名的格式一般都是这样的:

com.example.app1
com.example.app2
com.example.app.app1
com.example.app.app2

从系统版本上来看,取决于不同部分

  • iOS6上:取前两部分:com.example
  • iOS7以上:除了最后那部分的其他部分:com.example、com.example.app
    用表格来表示如下:
Bundle ID iOS 6.x iOS 7.x
com.example.app1 com.example com.example
com.example.app2 com.example com.example
com.example.app.app1 com.example com.example.app
com.example.app.app2 com.example com.example.app

因此,com.example.app1和com.example.app2也就属于同一个提供商了。

既然获取该值可能会为nil,切会改变。因为我们可以生产一个,并且用keychain保存起来。这样对于用一个APP提供商,同一个设备,无论用户删除APP与否,都可以获取到同一个值,相当于设备的唯一标识(IMEI)了。

以上的值,IMEI,UDID无法获取
IDFA根据值会因为用户的设置而获取不到,用户重置手机会改变。
IDFV用户充值手机会改变。且IDFA,IDFV都跟bundle identifier(包名)有关,不能对每个包都获得不同值,因此不合适。

生成UUID

//生成UUID
- (NSString *)uuidString{   
    CFUUIDRef uuid_ref = CFUUIDCreate(NULL);
    CFStringRef uuid_string_ref= CFUUIDCreateString(NULL, uuid_ref);
    NSString *uuid = [NSString stringWithString:(__bridge NSString *)uuid_string_ref];
    CFRelease(uuid_ref);
    CFRelease(uuid_string_ref);
    return [uuid lowercaseString];
}

通过测试,用这种方式每次生成的值都不一样。只能保存到keychain,每次获取,先去keychain获取,如果有则取出,没有则插入一个新的。即使用户删除该APP,UUID还是会保存在keychain,保证了UUID的唯一性。

至于如何使用keychain。。。等我研究后再写。现在用的是一个关于keychain框架,可以很方便的操作keychain。

也可以使用SSKeychain

以及别人使用来保存UUID的方式:

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

推荐阅读更多精彩内容