在我们的应用程序中-从现在到现在,我们一直在使用获取唯一设备ID [IDFV]并将其存储在客户注册期间的钥匙串访问中的逻辑,并在整个应用程序中使用,甚至在更新下一个版本时也会保留该逻辑传递给服务器并视为已注册客户。
但是将最新的应用程序版本上传到TestFlight时,它观察到[到目前为止已注意到的]设备中正在生成新的DEVICE ID [IDFV],这对现有客户而言是关注和影响的。在其他几台经过测试的设备中,DEVICE ID [IDFV]与以前相同。
如果标识符与“应用程序”一起保存,则Iam可以检索。但是,如果我使用其他一些键,它将重新创建设备ID。
[kw objectForKey:(NSString*)kSecAttrAccount]
使用其他键时,代码返回null。如果Key定义为“应用程序”,它将检索已存储的设备ID。
以下是该应用程序中使用的代码供您参考。
用于生成和检索设备ID [IDFV]的本地代码:
-(NSString*)getUDIDNumber
{
KeychainItemWrapper *kw = [[KeychainItemWrapper alloc] initWithIdentifier:@"Application" accessGroup:nil];
if (![kw objectForKey:(NSString*)kSecAttrAccount] || [[kw objectForKey:(NSString*)kSecAttrAccount] isEqualToString:@""])
{
NSString *identifierForVendor;
static NSString *uniqueIdentifier = nil;
uniqueIdentifier = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
(CFStringRef)[[[UIDevice currentDevice] identifierForVendor]UUIDString],
NULL,
(CFStringRef)@" !*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8);
identifierForVendor = [[NSString alloc] initWithFormat:@"%@",uniqueIdentifier];
[kw setObject:identifierForVendor forKey:(NSString*)kSecAttrAccount];
return identifierForVendor;
}
else
{
/* Retriving already stored device ID */
keychainvendor = [kw objectForKey:(NSString*)kSecAttrAccount];
return [kw objectForKey:(NSString*)kSecAttrAccount];
}
}