我想要 iPhone 设备的唯一标识符字符串,而不是UDID
和MAC
。
1。 Apple已弃用UDID
和MAC
。
2。我们可以使用UUID
但重新安装应用或删除应用后会有所变化。
我想要在重新安装或删除或升级iOS版本后保持相同设备的任何唯一值。
答案 0 :(得分:21)
您可以使用[[UIDevice currentDevice] identifierForVendor]
或任何其他唯一标识符生成器获取唯一标识符。之后,您应该使用KeychainItemWrapper
将该值存储在钥匙串上并使用。一旦您在钥匙串上存储了一个值,即使您删除并重新安装该应用程序,它也不会删除。
以下是钥匙串访问指南 - Link
答案 1 :(得分:2)
正如@danypata所说,使用this answer中描述的identifierForVendor。
或者您可以将广告NSUDID用作described here。
然而,这些可以作为零回来或随着时间的推移而改变。用户可以选择退出广告客户跟踪,因此我不建议您根据自己的目的使用它跟踪用户。
我想这取决于你为什么要首先跟踪他们的设备。我的态度是我不需要追踪用户的习惯。我只需要跟踪一般用户趋势和一些DAU信息。所以我编写了自己的UDID - 每次安装应用程序时都会更改。在我的下一个版本中,我将使用identifierForVendor,如果它是NIL,我将自己构成。
这就是我自己制作的方式:
// this makes a device id like: UUID = 89CD872F-C9AF-4518-9E6C-A01D35AF091C
// except that I'm going to attach some other attributes to it like the OS version, model type, etc.
// the UUID that is stored in user defaults will be like the one above.. but the device id that gets returned
// from this function and sent to [my online system] will have the extra info at the end of the string.
- (void) createUUID {
// for collecting some data.. let's add some info about the device to the uuid
NSString *thisDeviceID;
NSString *systemVersion = [[UIDevice currentDevice]systemVersion];
NSString *model = [[UIDevice currentDevice]model];
NSString *retinaTag;
if (retina) {
retinaTag = @"Retina";
}
else {
retinaTag = @"";
}
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
id uuid = [defaults objectForKey:@"uniqueID"];
if (uuid)
thisDeviceID = (NSString *)uuid;
else {
CFStringRef cfUuid = CFUUIDCreateString(NULL, CFUUIDCreate(NULL));
thisDeviceID = (__bridge NSString *)cfUuid;
CFRelease(cfUuid);
[defaults setObject:thisDeviceID forKey:@"uniqueID"];
}
//NSLog(@"UUID = %@", thisDeviceID);
MYthisDeviceID = [NSString stringWithFormat:@"%@-%@-%@-%@",thisDeviceID,systemVersion,retinaTag,model];
//NSLog(@"UUID with info = %@", MYthisDeviceID);
}
然后,发送到我的服务器的单个字符串都包含一个UDID,以及有关设备和操作系统的规范。在用户完全删除并重新加载应用程序之前,统计信息会显示该设备的使用情况。如果他们更新到新的操作系统,你不能获得双udids,你可以只裁剪到udid部分。
我根本不使用mac地址,因为我的理解是苹果不希望我们这样做。虽然我目前找不到任何说明的文件。
iOS7的更新:
我现在使用的代码在io6和io7下运行:
NSString *globalDeviceID;
- (void) createUUID
{
NSString *thisDeviceID;
NSString *systemVersion = [[UIDevice currentDevice]systemVersion];
NSString *model = [[UIDevice currentDevice]model];
NSString *retinaTag;
if (retina) {
retinaTag = @"Retina";
}
else {
retinaTag = @"";
}
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
id uuid = [defaults objectForKey:@"deviceID"];
if (uuid)
thisDeviceID = (NSString *)uuid;
else {
if ([[UIDevice currentDevice] respondsToSelector:@selector(identifierForVendor)]) {
thisDeviceID = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
}
else
{
CFStringRef cfUuid = CFUUIDCreateString(NULL, CFUUIDCreate(NULL));
thisDeviceID = (__bridge NSString *)cfUuid;
CFRelease(cfUuid);
}
[defaults setObject:thisDeviceID forKey:@"deviceID"];
}
NSLog(@"UUID = %@", thisDeviceID);
globalDeviceID = [NSString stringWithFormat:@"%@-%@-%@-%@",thisDeviceID,systemVersion,retinaTag,model];
NSLog(@"UUID with info = %@", globalDeviceID);
}
答案 2 :(得分:2)
尝试
[[UIDevice currentDevice] identifierForVendor];
来自iOS 6.
答案 3 :(得分:2)
或者只需使用以下内容并存储到NSUserDefaults
[NSProcessInfo processInfo].globallyUniqueString
流程的全局ID。该ID包括主机名,进程ID和时间戳,以确保该ID对于网络是唯一的。
答案 4 :(得分:0)
我建议你看看OpenUDID。
我相信它下面使用的是MAC地址,所以如果你说弃用访问MAC地址是正确的,那么它可能没什么用处,但是,我认为Apple删除它是不合理的访问; MAC地址还有其他应用程序只是为了UDID而识别设备