2

我正在使用供应商标识符,因为不推荐使用 UDID,但是在使用此应用程序后,它在 iOS 版本低于 6.0 的设备中不起作用。谁能告诉我需要做什么?该应用程序是否仅在 iOS 6.0 及更高版本中受支持?如何使我的应用程序在 iOS 版本低于 6.0 的设备上运行?下面是我正在使用的代码:

static NSString *uniqueIdentifier = nil;
id vendorIdObject = [[UIDevice currentDevice] identifierForVendor];
uniqueIdentifier = [vendorIdObject UUIDString];
4

2 回答 2

6

您可以执行以下操作(请注意,此返回的标识符未绑定到设备,并且如果用户删除并重新安装应用程序会更改):

NSString* uniqueIdentifier = nil;
if( [UIDevice instancesRespondToSelector:@selector(identifierForVendor)] ) {
  // iOS 6+
  uniqueIdentifier = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
} else {
  // before iOS 6, so just generate an identifier and store it
  uniqueIdentifier = [[NSUserDefaults standardUserDefaults] objectForKey:@"identiferForVendor"];
  if( !uniqueIdentifier ) {
    CFUUIDRef uuid = CFUUIDCreate(NULL);
    uniqueIdentifier = (__bridge_transfer NSString*)CFUUIDCreateString(NULL, uuid);
    CFRelease(uuid);
    [[NSUserDefaults standardUserDefaults] setObject:uniqueIdentifier forKey:@"identifierForVendor"];
  }
}

这将在 iOS-6 之前生成一个标识符并将其存储在默认值中,以便它通常是相同的标识符。如果您有一个钥匙串组和一套应用程序需要以与 类似的方式使用标识符identifierForVendor,您可以将其存储在钥匙串中而不是用户默认值中。

于 2013-06-26T06:45:52.953 回答
0

可能的解决方案:

  1. 在运行时检查 iOS 版本
  2. 如果是 iOS 6+ 使用identifierForVendor
  3. 如果低于 iOS 6 使用uniqueIdentifier

编辑:正如 rmaddy 所说,应用商店将拒绝该应用。

所以最好的方法是使用CFUUIDCreate()

CFUUIDRef locUDIDRef = CFUUIDCreate(NULL);  
CFStringRef locUDIDRefString = CFUUIDCreateString(NULL, locUDIDRef);  
NSString *locUDID = [NSString stringWithString:(NSString *) locUDIDRefString];  
CFRelease(locUDIDRef);  
CFRelease(uuidStringRef);  

iOS 6 中 UDID 的参考替代方案

于 2013-06-26T06:28:27.243 回答