我想要检测iPhone设备的唯一标识符字符串(就像UDID)?

我想要检测iPhone设备的唯一标识符字符串(就像UDID)?,iphone,ios,objective-c,uniqueidentifier,Iphone,Ios,Objective C,Uniqueidentifier,我想要iPhone设备的唯一标识符字符串,而不是UDID和MAC 1.GetUDID和MAC被苹果公司弃用 2.我们可以使用UUID,但在重新安装应用程序或删除应用程序后,它将得到更改 我希望在应用程序重新安装、删除或升级iOS版本后,设备的任何唯一值保持不变。我建议查看一下 我相信它使用的是MAC地址,所以如果你说访问MAC地址不受欢迎是正确的,那么它可能没有多大用处,然而,我认为苹果删除访问权限是不合理的;MAC地址还有其他应用程序,它们只是为了UDID的目的识别设备。正如@danypata

我想要iPhone设备的唯一标识符字符串,而不是
UDID
MAC

1.Get
UDID
MAC
被苹果公司弃用
2.我们可以使用
UUID
,但在重新安装应用程序或删除应用程序后,它将得到更改


我希望在应用程序重新安装、删除或升级iOS版本后,设备的任何唯一值保持不变。

我建议查看一下


我相信它使用的是MAC地址,所以如果你说访问MAC地址不受欢迎是正确的,那么它可能没有多大用处,然而,我认为苹果删除访问权限是不合理的;MAC地址还有其他应用程序,它们只是为了UDID的目的识别设备。

正如@danypata所说的,使用中所述的供应商标识

或者,你也可以像以前一样使用广告

但是,这些值可以返回为零,也可以随着时间的推移而改变。用户可以选择退出广告客户跟踪,因此我不建议出于您自己的目的使用它来跟踪用户

我想这取决于你为什么要首先跟踪他们的设备。我的态度是,我不需要永远跟踪用户的习惯。我只需要跟踪一般用户趋势和一些DAU信息。因此,我制作了自己的UDID,每次安装应用程序时都会更改。在我的下一个版本中,我将使用identifierForVendor,如果它为零,我将自己制作

我就是这样做的:

// 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,也有关于设备和操作系统的规范。在用户完全删除并重新加载应用程序之前,统计数据将显示该设备的使用情况。要想在更新到新操作系统时不获得双udid,可以裁剪到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);
}
试一试

[[UIDevice currentDevice]供应商标识]


它来自iOS 6

您可以使用
[[UIDevice currentDevice]identifierForVendor]
或任何其他唯一标识符生成器获取唯一标识符。之后,您应该使用
KeychainItemWrapper
将该值存储在keychain上,并使用。一旦你在钥匙链上存储了一个值,即使你删除并重新安装了应用程序,它也不会被删除


以下是钥匙链访问指南-

或只需使用以下内容并存储到
NSUserDefaults

[NSProcessInfo processInfo].globallyUniqueString
进程的全局ID。该ID包括主机名、进程ID和时间戳,以确保该ID对于网络是唯一的


你能给我看一下不推荐使用MAC地址的文档吗?我没听说过这个。我想你唯一的选择就是查询MAC地址并用它做点什么。。已经讨论过了,所以我认为这个问题是重复的。我不认为MAC地址不受欢迎,至少我找不到任何文档如果您的iOS目标是6.0及以上版本,则有
[[UIDevice currentDevice]identifierForVendor]
UDID已被弃用,但这是我第一次听说MAC地址已被弃用。请分享您阅读过的文档,以便我们了解最新信息。也可以在这里查看我的答案,但我不知道我可以为旧版本的ios6Thanks使用UDID来添加密钥链。我不知道那件事。我也将在我的解决方案中实现这一点。但若用户恢复他/她的手机呢?当时钥匙链也被移除了。嗨,这段代码不是在iOS 7上崩溃了吗??我已经实现了一些不同形式的代码,它在IOS7中开始崩溃。我将编辑我的答案,添加我当前版本的代码,我在io7中使用的代码很好。唯一的问题是,苹果会在审查期间询问使用情况,所以,也许这可能意味着一个不同的审查或任何其他可能更好地避免…永远不知道。。。