Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何生成在所有iOS版本中都可以使用的唯一标识符?_Iphone_Ios_Uniqueidentifier_Udid - Fatal编程技术网

Iphone 如何生成在所有iOS版本中都可以使用的唯一标识符?

Iphone 如何生成在所有iOS版本中都可以使用的唯一标识符?,iphone,ios,uniqueidentifier,udid,Iphone,Ios,Uniqueidentifier,Udid,我想获得支持所有iOS版本的唯一标识符。有人能帮我解决这个问题吗。正如您所知,苹果公司不赞成UDID方法,因此有可能使用wifi mac地址生成唯一id。但苹果公司将在iOS7版本中删除wifi mac地址。因此,我的要求是生成一个新的唯一代码,该代码应能在所有iOS版本中运行。提前感谢 注意:一旦用户重新启动设备或重新安装应用程序,请不要更改UDID。我现在没有访问代码的权限,如果您仍然需要,可以在几个小时后发布,但我所做的是在助手类中创建静态方法“deviceIdentifier” 该方法对

我想获得支持所有iOS版本的唯一标识符。有人能帮我解决这个问题吗。正如您所知,苹果公司不赞成UDID方法,因此有可能使用wifi mac地址生成唯一id。但苹果公司将在iOS7版本中删除wifi mac地址。因此,我的要求是生成一个新的唯一代码,该代码应能在所有iOS版本中运行。提前感谢


注意:一旦用户重新启动设备或重新安装应用程序,请不要更改UDID。

我现在没有访问代码的权限,如果您仍然需要,可以在几个小时后发布,但我所做的是在助手类中创建静态方法“deviceIdentifier”

该方法对当前iOS版本进行基本检查,如果低于6.0,则返回UDID,否则返回uniqueIdentifier


请告诉我您是否需要该代码,我会在可能的时候发布。如果我没记错的话,它只有10-15行左右,但是会有很大的不同,因为您可以调用“[myHelper deviceIdentifier]'只要您需要设备ID,就不必担心他们使用的是哪个iOS版本。

现在,设备标识符将更改为UUID。您可以通过以下代码获得UUID:

- (NSString *)getUUID
{
    NSString *UUID = [[NSUserDefaults standardUserDefaults] objectForKey:@"uniqueID"];
    if (!UUID) {
        CFUUIDRef theUUID = CFUUIDCreate(NULL);
        CFStringRef string = CFUUIDCreateString(NULL, theUUID);
        CFRelease(theUUID);
        UUID = [(__bridge NSString*)string stringByReplacingOccurrencesOfString:@"-"withString:@""];
        [[NSUserDefaults standardUserDefaults] setValue:UUID forKey:@"uniqueID"];
    }
    return UUID;
}

它在所有iOS版本中都可以工作。

我正在更新我的应用程序,该应用程序仅基于支持iOS 4.3及以上版本的唯一标识符工作。所以

1我无法使用[UIDevice currentDevice]。唯一标识符;因为已经没有了

2我无法使用[UIDevice currentDevice].identifierForVendor.UUIString,因为它仅在iOS 6.0及更高版本中可用,并且无法用于较低的iOS版本

3由于在iOS-7中不允许mac地址,因此它不是一个选项

4是一段时间以前的事了,而且iOS-6也有问题

iOS-5及以下版本也没有5个广告标识符

最后我就是这么做的

项目中添加了一个

b生成的CFUUID密钥字符串

 CFUUIDRef cfuuid = CFUUIDCreate(kCFAllocatorDefault);
    udidString = (NSString*)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, cfuuid));
c将其保存到Key-Chain Utils,否则每次都会生成一个新的Unique

最终代码


非常感谢您的快速信息。。正如您所知,apple不赞成UDID方法,因此我实现了使用Mac地址生成唯一标识符。但苹果公司将在iOS7版本中删除wifi mac地址。因此,我需要生成一个新的唯一代码,该代码应能在包括iOS7在内的所有版本中运行。请分享您的逻辑,这将对我有很大帮助。。再次感谢..嗨,Gahesh-我仔细检查了我的代码,记得我从那里完全取出了供应商代码的预标识,只是为了确保符合苹果的指导方针,我认为他们对在新应用程序中使用UDID的人非常严格,即使只是为了支持旧版本的iiOSSo,我也只是使用供应商的标识,我知道它不能满足您的要求,即即使在应用程序卸载中它也必须保持不变Hi James,idenetifierForVendor可从iOS 6获得。但使用它我们可以支持iOS6或更高版本的设备。这里我的问题是如何支持更低版本。我坚信有一个解决办法。让我们拭目以待:是的,一旦重新安装应用程序,UDID就会被更改。这个逻辑不能完全满足我的要求。不管怎样,谢谢你的逻辑。他们拒绝使用这种独特的ID是有原因的。创建并存储您自己的UUID CFUUID创建或使用供应商标识谢谢。请注意,SFHFKeychainUtils的创建者说,它应该被视为不推荐使用,而应该使用他的STUtils。此外,还应添加CFReleasecfuuid;使用上面的GetDeviceID方法来防止内存泄漏。@ghr。是的,他说不管我如何使用它,它都应该被认为是不推荐的。在许多应用中没有ay问题。再次感谢我不知何故跳过了。@NSQuamber.java,卸载应用程序后是否会更改生成的id?我有一个要求,即id必须是唯一的,并将发送到服务器。即使用户卸载/重新安装应用程序,我也应该具有相同的id。您的解决方案是否可能实现这一点?另外,它对iOS 8.4仍然有效吗?感觉苹果讨厌开发者-@shamaleyte你能测试这个吗?我还需要获取设备的唯一标识符,该标识符在重新安装应用程序后不会更改
+ (NSString *)GetDeviceID {
    NSString *udidString;
   udidString = [self objectForKey:@"deviceID"];
    if(!udidString)
    {
    CFUUIDRef cfuuid = CFUUIDCreate(kCFAllocatorDefault);
    udidString = (NSString*)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, cfuuid));
    CFRelease(cfuuid);
        [self setObject:udidString forKey:@"deviceID"];
    }
    return udidString;
}

+(void) setObject:(NSString*) object forKey:(NSString*) key
{
    NSString *objectString = object;
    NSError *error = nil;
    [SFHFKeychainUtils storeUsername:key
                         andPassword:objectString
                      forServiceName:@"LIB"
                      updateExisting:YES
                               error:&error];

    if(error)
        NSLog(@"%@", [error localizedDescription]);
}

+(NSString*) objectForKey:(NSString*) key
{
    NSError *error = nil;
    NSString *object = [SFHFKeychainUtils getPasswordForUsername:key
                                                  andServiceName:@"LIB"
                                                           error:&error];
    if(error)
        NSLog(@"%@", [error localizedDescription]);

    return object;
}