这几天由于在做对用户进行统计,所以做了一些对唯一标识符的了解。
UDID
UDID(Unique Device Identifier)这才是我们真正意义上的设备唯一标识符。在iOS5以前可以通过
[UIDevice uniqueIdentifier]
这个方法获得。可是在iOS5以后已经被废弃了,后来开始使用Mac address来作为唯一标识符,同样最后又被封杀了。
所以现在没有真正意义上的唯一标识符。
UUID
UUID(Universally Unique Identifier)这是现在普遍使用的所谓的唯一标识符,可以从下面方法获取
[[NSUUID UUID] UUIDString]
但是常用的获取UUID还有两种方法:
- 广告标识符(advertisingIdentifier)
- vendor标识符
广告标识符
[[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]
该方法需要添加框架头文件AdSupport.h,这方法是在iOS6中加的。这是由系统储存的,但是当这几种情况下会重置广告标识符:
- 用户完全重置系统
- 用户明确的还原广告
vendor标识符
[[[UIDevice currentDevice] identifierForVendor] UUIDString]
同一开发商的APP在指定机器上都会获得同一个ID。当我们删除了某一个设备上某个开发商的所有APP之后,下次获取将会获取到不同的ID。
是不是发现以上方法都不是真正意义上的唯一标识符。
现在如何获取?
现在获取的方法就是将UUID存入keychain中,每次要使用的时候就从keychain中获取,这样当app卸载后还会保存着这个“唯一标识符”。
碰到的问题
现在不知道keychain中存储的这个标识符是否会在手机被重置后被销毁。也就是问题在于keychain是否跟我们的apple Id相关联然后将这个标识符存入云中。
我是这样实验的:
- 用我的apple Id 登录,然后打印出标识符 。
-卸载这个软件,再次打印标识符,发现这个标识符跟原来那个标识符是一致的。 - 卸载软件后换另一个apple Id 登陆,再次打印标识符,发现跟原来标识符还是一致。
- 重置手机后再次用重复上述方法,打印结果不一致。
我的结论
我认为keychain(我不知道这个keychain和那个iCloud keychain到底是不是同一个东西)和apple Id没有关系,这个唯一标识符和apple Id并没有关系,重置后标识符改变说明标识符还是不好用啊。不过一般人也不会经常去重置手机,所以用来作为统计用户数据也还是基本可行的。
以上结论仅代表个人观点,希望大家能指点一下,纠正我的错误。
网友评论
+ (NSString*) getUUIDString
{
CFUUIDRef uuidObj = CFUUIDCreate(nil);
NSString *uuidString = (__bridge_transfer NSString*)CFUUIDCreateString(nil, uuidObj);
CFRelease(uuidObj);
return uuidString;
}
目前我用的是这个UUID,这个UUID 每次安装同一个app都不一样,恰好能通过存钥匙串来实现一个app"唯一标识", 同样它也会被完全初始化iphone而抹掉钥匙串。