我如何为 iOS 台设备生成和使用唯一的 deviceId?
How can i generate and use unique deviceId for iOS devices?
在我以前的应用程序中,我使用下面提到的代码为 iOS devices.But 生成唯一的 deviceId 问题是每次应用程序 [=15] 时它都会生成一个新代码=] 我可以正确地做到这一点吗?
-(NSString*)uniqueIDForDevice //new..
{
NSString* uniqueIdentifier = nil;
if( [UIDevice instancesRespondToSelector:@selector(identifierForVendor)] ) { // >=iOS 7
uniqueIdentifier = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
}
else
{ //<=iOS6, Use UDID of Device
CFUUIDRef uuid = CFUUIDCreate(NULL);
//uniqueIdentifier = ( NSString*)CFUUIDCreateString(NULL, uuid);- for non- ARC
uniqueIdentifier = ( NSString*)CFBridgingRelease(CFUUIDCreateString(NULL, uuid));// for ARC
CFRelease(uuid);
}
return uniqueIdentifier;
}
首先获取 vendorId(uniqueID) 然后将其存储到钥匙串
// Fetch vendorID from keychain first, if it exists then use it or fetch vendorID
//if user delete app and again install app than he get vendorID from keychain(if he hasn't cleared it)
NSString *vendorID = [UICKeyChainStore stringForKey:@"KEY TO SAVE TO Keychain" service:nil];
NSLog(@"VendorID from Keychain - %@",vendorID);
//if vandorid from keychain is not nil
if (vendorID)
{
[[NSUserDefaults standardUserDefaults] setObject:vendorID forKey:@"vendorId"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
//else it goes for new vendorid and then stored it to keychan
else
{
vendorID = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
[UICKeyChainStore setString:vendorID forKey:@"KEY TO SAVE TO Keychain" service:nil];
[[NSUserDefaults standardUserDefaults] setObject:vendorID forKey:@"vendorId"];
[[NSUserDefaults standardUserDefaults] synchronize];
NSLog(@"VendorID Local - %@",vendorID);
}
我使用 this class 从 keyChain 保存和检索 vendorID!
看一看this.hope对你有帮助
您可以使用下面的
+ (NSString *)deviceUUID
{
if([[NSUserDefaults standardUserDefaults] objectForKey:[[NSBundle mainBundle] bundleIdentifier]])
return [[NSUserDefaults standardUserDefaults] objectForKey:[[NSBundle mainBundle] bundleIdentifier]];
@autoreleasepool {
CFUUIDRef uuidReference = CFUUIDCreate(nil);
CFStringRef stringReference = CFUUIDCreateString(nil, uuidReference);
NSString *uuidString = (__bridge NSString *)(stringReference);
[[NSUserDefaults standardUserDefaults] setObject:uuidString forKey:[[NSBundle mainBundle] bundleIdentifier]];
[[NSUserDefaults standardUserDefaults] synchronize];
CFRelease(uuidReference);
CFRelease(stringReference);
return uuidString;
}
}
我正在使用 UUID 生成唯一编号。我怀疑如果我们不在应用程序中使用 iAds,是否允许使用供应商 ID。
我通过生成 UUID 然后存储到钥匙串中实现了这一点。
Keychain 将存储您的 UUID,直到用户不会进行硬重置(这种情况很少见)。
由于 Apple 没有提供 API 来获取唯一的设备 ID,我们必须找到这样的方法。
使用 This link 到 UICKeyChainStore 。我添加了以下方法调用
[self getDeviceIdFromKeychain];
在 appDelegate 应用中didFinishLaunchingWithOptions
-(void)getDeviceIdFromKeychain
{
NSString *deviceID = [UICKeyChainStore stringForKey:DEVICE_ID_FROM_KEYCHAIN_REFERENCE_APP service:nil];
NSLog(@"deviceID from Keychain = (%@)",deviceID);
//if vandorid from keychain is not nil
if (deviceID)
{
[[NSUserDefaults standardUserDefaults] setObject:deviceID forKey:DEVICE_ID];
[[NSUserDefaults standardUserDefaults] synchronize];
}
//else it goes for new vendorid and then stored it to keychan
else if (deviceID == (id)[NSNull null] || deviceID.length == 0 )
{
NSString *newDeviceId;
newDeviceId=[[self class] deviceUUID];
[[NSUserDefaults standardUserDefaults] setObject:newDeviceId forKey:DEVICE_ID];
[[NSUserDefaults standardUserDefaults] synchronize];
[UICKeyChainStore setString:newDeviceId forKey:DEVICE_ID_FROM_KEYCHAIN_REFERENCE_APP service:nil];
NSLog(@"new deviceID = (%@)",newDeviceId);
}
}
+ (NSString *)deviceUUID
{
if([[NSUserDefaults standardUserDefaults] objectForKey:[[NSBundle mainBundle] bundleIdentifier]])
return [[NSUserDefaults standardUserDefaults] objectForKey:[[NSBundle mainBundle] bundleIdentifier]];
@autoreleasepool {
CFUUIDRef uuidReference = CFUUIDCreate(nil);
CFStringRef stringReference = CFUUI
DCreateString(nil, uuidReference);
NSString *uuidString = (__bridge NSString *)(stringReference);
[[NSUserDefaults standardUserDefaults] setObject:uuidString forKey:[[NSBundle mainBundle] bundleIdentifier]];
[[NSUserDefaults standardUserDefaults] synchronize];
CFRelease(uuidReference);
CFRelease(stringReference);
return uuidString;
}
}
我这样使用它们...(在我的 signinViewcontroller 中)
NSString *deviceIDfromNSUserDefaults = [[NSUserDefaults standardUserDefaults]valueForKey:DEVICE_ID ];
NSLog(@"deviceID from NSUserDefaults = (%@)",deviceIDfromNSUserDefaults);
在我以前的应用程序中,我使用下面提到的代码为 iOS devices.But 生成唯一的 deviceId 问题是每次应用程序 [=15] 时它都会生成一个新代码=] 我可以正确地做到这一点吗?
-(NSString*)uniqueIDForDevice //new..
{
NSString* uniqueIdentifier = nil;
if( [UIDevice instancesRespondToSelector:@selector(identifierForVendor)] ) { // >=iOS 7
uniqueIdentifier = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
}
else
{ //<=iOS6, Use UDID of Device
CFUUIDRef uuid = CFUUIDCreate(NULL);
//uniqueIdentifier = ( NSString*)CFUUIDCreateString(NULL, uuid);- for non- ARC
uniqueIdentifier = ( NSString*)CFBridgingRelease(CFUUIDCreateString(NULL, uuid));// for ARC
CFRelease(uuid);
}
return uniqueIdentifier;
}
首先获取 vendorId(uniqueID) 然后将其存储到钥匙串
// Fetch vendorID from keychain first, if it exists then use it or fetch vendorID
//if user delete app and again install app than he get vendorID from keychain(if he hasn't cleared it)
NSString *vendorID = [UICKeyChainStore stringForKey:@"KEY TO SAVE TO Keychain" service:nil];
NSLog(@"VendorID from Keychain - %@",vendorID);
//if vandorid from keychain is not nil
if (vendorID)
{
[[NSUserDefaults standardUserDefaults] setObject:vendorID forKey:@"vendorId"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
//else it goes for new vendorid and then stored it to keychan
else
{
vendorID = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
[UICKeyChainStore setString:vendorID forKey:@"KEY TO SAVE TO Keychain" service:nil];
[[NSUserDefaults standardUserDefaults] setObject:vendorID forKey:@"vendorId"];
[[NSUserDefaults standardUserDefaults] synchronize];
NSLog(@"VendorID Local - %@",vendorID);
}
我使用 this class 从 keyChain 保存和检索 vendorID!
看一看this.hope对你有帮助
您可以使用下面的
+ (NSString *)deviceUUID
{
if([[NSUserDefaults standardUserDefaults] objectForKey:[[NSBundle mainBundle] bundleIdentifier]])
return [[NSUserDefaults standardUserDefaults] objectForKey:[[NSBundle mainBundle] bundleIdentifier]];
@autoreleasepool {
CFUUIDRef uuidReference = CFUUIDCreate(nil);
CFStringRef stringReference = CFUUIDCreateString(nil, uuidReference);
NSString *uuidString = (__bridge NSString *)(stringReference);
[[NSUserDefaults standardUserDefaults] setObject:uuidString forKey:[[NSBundle mainBundle] bundleIdentifier]];
[[NSUserDefaults standardUserDefaults] synchronize];
CFRelease(uuidReference);
CFRelease(stringReference);
return uuidString;
}
}
我正在使用 UUID 生成唯一编号。我怀疑如果我们不在应用程序中使用 iAds,是否允许使用供应商 ID。 我通过生成 UUID 然后存储到钥匙串中实现了这一点。 Keychain 将存储您的 UUID,直到用户不会进行硬重置(这种情况很少见)。
由于 Apple 没有提供 API 来获取唯一的设备 ID,我们必须找到这样的方法。
使用 This link 到 UICKeyChainStore 。我添加了以下方法调用
[self getDeviceIdFromKeychain];
在 appDelegate 应用中didFinishLaunchingWithOptions
-(void)getDeviceIdFromKeychain
{
NSString *deviceID = [UICKeyChainStore stringForKey:DEVICE_ID_FROM_KEYCHAIN_REFERENCE_APP service:nil];
NSLog(@"deviceID from Keychain = (%@)",deviceID);
//if vandorid from keychain is not nil
if (deviceID)
{
[[NSUserDefaults standardUserDefaults] setObject:deviceID forKey:DEVICE_ID];
[[NSUserDefaults standardUserDefaults] synchronize];
}
//else it goes for new vendorid and then stored it to keychan
else if (deviceID == (id)[NSNull null] || deviceID.length == 0 )
{
NSString *newDeviceId;
newDeviceId=[[self class] deviceUUID];
[[NSUserDefaults standardUserDefaults] setObject:newDeviceId forKey:DEVICE_ID];
[[NSUserDefaults standardUserDefaults] synchronize];
[UICKeyChainStore setString:newDeviceId forKey:DEVICE_ID_FROM_KEYCHAIN_REFERENCE_APP service:nil];
NSLog(@"new deviceID = (%@)",newDeviceId);
}
}
+ (NSString *)deviceUUID
{
if([[NSUserDefaults standardUserDefaults] objectForKey:[[NSBundle mainBundle] bundleIdentifier]])
return [[NSUserDefaults standardUserDefaults] objectForKey:[[NSBundle mainBundle] bundleIdentifier]];
@autoreleasepool {
CFUUIDRef uuidReference = CFUUIDCreate(nil);
CFStringRef stringReference = CFUUI
DCreateString(nil, uuidReference);
NSString *uuidString = (__bridge NSString *)(stringReference);
[[NSUserDefaults standardUserDefaults] setObject:uuidString forKey:[[NSBundle mainBundle] bundleIdentifier]];
[[NSUserDefaults standardUserDefaults] synchronize];
CFRelease(uuidReference);
CFRelease(stringReference);
return uuidString;
}
}
我这样使用它们...(在我的 signinViewcontroller 中)
NSString *deviceIDfromNSUserDefaults = [[NSUserDefaults standardUserDefaults]valueForKey:DEVICE_ID ];
NSLog(@"deviceID from NSUserDefaults = (%@)",deviceIDfromNSUserDefaults);