我如何为 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);