UDID全称为Unique Device Identifier Description,是一个40个字符串的序号,用来标示唯一的iOS设备。
获取方式
[[UIDevice currentDevice] uniqueIdentifier];
iOS 2.0版本以后UIDevice提供一个获取设备唯一标识符的方法uniqueIdentifier,通过该方法我们可以获取设备的序列号,这个也是目前为止唯一可以确认唯一的标示符。 许多开发者把UDID跟用户的真实姓名、密码、住址、其它数据关联起来;网络窥探者会从多个应用收集这些数据,然后顺藤摸瓜得到这个人的许多隐私数据。同时大部分应用确实在频繁传输UDID和私人信息。iOS5之后废弃
全称时Universally Unique IDentifier,它是基于iOS设备上面某个单个的应用程序,只要用户没有完全删除应用程序,则这个 UUID 在用户使用该应用程序的时候一直保持不变。
获取方式
[NSUUID UUID].UUIDString
值是否变化
如果用户删除了这个应用程序,然后再重新安装
刷机或重装系统后uuid还是会改变
我们可以获取到UUID,然后把UUID保存到KeyChain里面,这样以后即使APP删了再装回来,也可以从KeyChain中读取回来。使用group还可以可以保证同一个开发商的所有程序针对同一台设备能够获取到相同的不变的UDID,以此来实现设备的唯一标示。
注意:但是刷机或重装系统后uuid还是会改变。
使用Keychain,将UUID当做密码信息来存储.
大致流程:
+ (NSString *)randomUUID {
if(NSClassFromString(@"NSUUID")) { // only available in iOS >= 6.0
return [[NSUUID UUID] UUIDString];
}
CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);
CFStringRef cfuuid = CFUUIDCreateString(kCFAllocatorDefault, uuidRef);
CFRelease(uuidRef);
NSString *uuid = [((__bridge NSString *) cfuuid) copy];
CFRelease(cfuuid);
return uuid;
}
+ (void)setValue:(NSString *)value forKey:(NSString *)key inService:(NSString *)service {
NSMutableDictionary *keychainItem = [[NSMutableDictionary alloc] init];
keychainItem[(__bridge id)kSecClass] = (__bridge id)kSecClassGenericPassword;
keychainItem[(__bridge id)kSecAttrAccessible] = (__bridge id)kSecAttrAccessibleAlways;
keychainItem[(__bridge id)kSecAttrAccount] = key;
keychainItem[(__bridge id)kSecAttrService] = service;
keychainItem[(__bridge id)kSecValueData] = [value dataUsingEncoding:NSUTF8StringEncoding];
SecItemAdd((__bridge CFDictionaryRef)keychainItem, NULL);
}
如果更新了provisioning profile的话, Keychain data会丢失.所以我们应该将UUID在NSUserDefault备份.
[[NSUserDefaults standardUserDefaults] setObject:@”123456-1234-1234-12345678” forKey:@"deviceUID"];
[[NSUserDefaults standardUserDefaults] synchronize];
IDFA全称为advertisingIdentifier,在同一个设备上的所有App都会取到相同的值,用于给开发者跟踪广告效果用的,可看作是iPhone 的设备临时身份证,说是临时身份证是因为它允许用户更换。
获取代码:
#import
// 用户是否限制广告追踪
Boolean on = [[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled];
//如果可以获取到获取IDFA
NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
值是否改变
注意:用户可以在 设置|隐私|广告追踪 里重置此id或者限制追踪,就会出现idfa不一致或取不到,故绝不可以作为业务分析的主id,来识别用户。
全名:identifierForVendor ,是给Vendor(开发商)标识用户用的。在同一设备上,同一个Vender的应用的所有app,IDFV的值相同。
判断Vender是否相同是通过BundleID的反转的前两部分进行匹配,如果相同就是同一个Vender,例如对于com.taobao.app1, com.taobao.app2 这两个BundleID来说,就属于同一个Vender,共享同一个idfv的值。和idfa不同的是,idfv的值是一定能取到的,所以非常适合于作为内部用户行为分析的主id,来标识用户,替代OpenUDID。
获取代码:
#import
[[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]
值是否改变
如果用户将属于该应用开发商的所有App都卸载,则IDFV的值会被重置,即使再重装此开发商的App,IDFV的值也和之前不同