19

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

1.获取UDID并被MAC苹果弃用。
2.我们可以使用UUID,但重新安装应用程序或删除应用程序后会改变。

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

4

5 回答 5

21

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

这是钥匙串访问指南 -链接

于 2013-05-21T08:41:21.710 回答
2

正如@danypata 所说,使用此答案中描述的 identifierForVendor 。

或者,您也可以使用此处描述的广告 NSUDID 。

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

我想这取决于您首先要跟踪他们的设备的原因。我的态度是我不需要永远跟踪用户的习惯。我只需要跟踪一般用户趋势和一些 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 又有关于设备和操作系统的规范。在用户完全删除并重新加载应用程序之前,统计信息会显示该设备上的使用情况。如果它们更新到新的操作系统,则不会获得双重 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);
}
于 2013-05-21T07:36:35.673 回答
2

尝试

[[UIDevice currentDevice] identifierForVendor];

它来自iOS 6。

于 2013-05-21T08:28:44.177 回答
2

或者简单地使用以下内容并存储到NSUserDefaults

[NSProcessInfo processInfo].globallyUniqueString

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

于 2013-11-12T20:55:45.393 回答
0

我建议看看OpenUDID

我相信它在下面使用MAC地址,所以如果你说不推荐访问MAC地址是正确的,那么它可能没有多大用处,但是,我认为Apple删除访问是不合理的;MAC 地址有其他应用程序,仅用于识别设备以用于 UDID

于 2013-05-21T07:08:17.697 回答