如何在钥匙串 iOS 中保存 UUID? [英] How to Save UUID in the keychain iOS?

查看:71
本文介绍了如何在钥匙串 iOS 中保存 UUID?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是 iOS 开发的新手,我想将我的应用程序 UUID 存储在 KeyChain 中,所以任何时候我的应用程序 UUID 保持不变,我都会对其进行研发并从该站点查找代码,我搞砸了 StackOver Flow,代码就像作为

i am newbie in iOS Development and i want to store my Application UUID in KeyChain so For any Time my Application UUID remaining same i do R&D on it and Find a code from this Site i mess StackOver Flow the Code is like as

+(NSUUID *)persistentIdentifierForVendor
{
static NSString * const kKeyChainVendorID = @"co.cwbrn.PersistentIdentifier";
static NSString * const kKeyChainVendorIDAccessGroup = @"<AppIdentifier>.<keychain-access-group-identifier>";

// First, check NSUserDefaults so that we're not hitting the KeyChain every single time
NSString *uuidString = [[NSUserDefaults standardUserDefaults] stringForKey:kKeyChainVendorIDGroup];
BOOL vendorIDMissingFromUserDefaults = (uuidString == nil || uuidString.length == 0);

if (vendorIDMissingFromUserDefaults) {
    // Check to see if a UUID is stored in the KeyChain
    NSDictionary *query = @{
                            (__bridge id)kSecClass:             (__bridge id)kSecClassGenericPassword,
                            (__bridge id)kSecAttrAccount:       kKeyChainVendorID,
                            (__bridge id)kSecAttrService:       kKeyChainVendorID,
                            (__bridge id)kSecAttrAccessGroup:   kKeyChainVendorIDAccessGroup,
                            (__bridge id)kSecMatchLimit:        (__bridge id)kSecMatchLimitOne,
                            (__bridge id)kSecReturnAttributes:  (__bridge id)kCFBooleanTrue
                           };
    CFTypeRef attributesRef = NULL;
    OSStatus result = SecItemCopyMatching((__bridge CFDictionaryRef)query, &attributesRef);
    if (result == noErr) {
        // There is a UUID, so try to retrieve it
        NSDictionary *attributes = (__bridge_transfer NSDictionary *)attributesRef;
        NSMutableDictionary *valueQuery = [NSMutableDictionary dictionaryWithDictionary:attributes];

        [valueQuery setObject:(__bridge id)kSecClassGenericPassword  forKey:(__bridge id)kSecClass];
        [valueQuery setObject:(__bridge id)kCFBooleanTrue            forKey:(__bridge id)kSecReturnData];

        CFTypeRef passwordDataRef = NULL;
        OSStatus result = SecItemCopyMatching((__bridge CFDictionaryRef)valueQuery, &passwordDataRef);
        if (result == noErr) {
            NSData *passwordData = (__bridge_transfer NSData *)passwordDataRef;
            uuidString = [[NSString alloc] initWithBytes:[passwordData bytes]
                                                  length:[passwordData length]
                                                encoding:NSUTF8StringEncoding];
        }
    }
}

// Failed to read the UUID from the KeyChain, so create a new UUID and store it
if (uuidString == nil || uuidString.length == 0) {
    // Generate the new UIID
    CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);
    uuidString = (__bridge_transfer NSString *)CFUUIDCreateString(kCFAllocatorDefault, uuidRef);
    CFRelease(uuidRef);

    // Now store it in the KeyChain
    NSDictionary *query = @{    (__bridge id)kSecClass:             (__bridge id)kSecClassGenericPassword,
                                (__bridge id)kSecAttrAccount:       kKeyChainVendorID,
                                (__bridge id)kSecAttrService:       kKeyChainVendorID,
                                (__bridge id)kSecAttrAccessGroup:   kKeyChainVendorIDAccessGroup,
                                (__bridge id)kSecAttrLabel:         @"",
                                (__bridge id)kSecAttrDescription:   @"",
                                (__bridge id)kSecAttrAccessible:    (__bridge id)kSecAttrAccessibleAfterFirstUnlock,
                                (__bridge id)kSecValueData:         [uuidString dataUsingEncoding:NSUTF8StringEncoding]
                            };

    OSStatus result = SecItemAdd((__bridge CFDictionaryRef)query, NULL);
    if (result != noErr) {
        NSLog(@"ERROR: Couldn't add to the Keychain. Result = %ld; Query = %@", result, query);
        return nil;
    }
}

// Save UUID to NSUserDefaults so that we can avoid the KeyChain next time
if (vendorIDMissingFromUserDefaults) {
    [[NSUserDefaults standardUserDefaults] setObject:uuidString forKey:kKeyChainVendorIDGroup];
}

return [[NSUUID alloc] initWithUUIDString:uuidString];

}

但我想知道这里什么是 kKeyChainVendorIDkKeyChainVendorIDAccessGroup 在这里它使用就像

But i want to Know that here What is kKeyChainVendorID and kKeyChainVendorIDAccessGroup here it use is like as

 static NSString * const kKeyChainVendorID = @"co.cwbrn.PersistentIdentifier";
static NSString * const kKeyChainVendorIDAccessGroup = @"<AppIdentifier>.<keychain-access-group-identifier>";

对于我的应用程序,我如何获得两个值,例如 kKeyChainVendorIDkKeyChainVendorIDAccessGroup??请给我解决方案,在我的 Xcode 5.0 版本中,错误发生在行

For My application how i Get two Value like as kKeyChainVendorID and kKeyChainVendorIDAccessGroup??Please Give me Solution for that and in my Xcode 5.0 Version error are Occurred in line

 NSString *uuidString = [[NSUserDefaults standardUserDefaults] stringForKey:kKeyChainVendorIDGroup];

错误是:- 将 kKeyChainVendorIDGroup 替换为 kKeyChainVendorID.我可以更换它然后它是否有效请为我的两个问题提供解决方案

Erro is:- Replace kKeyChainVendorIDGroup with kKeyChainVendorID. Can i replace it then it is Work or not Please Give me Solution For my Both Question

提前致谢.并感谢 nelico 在堆栈溢出中发布答案.

Thanks in advance. and thanks to nelico that post answer in stack overflow.

推荐答案

我在这里发布我自己的答案.我从这个链接得到答案

Here i Post My Own Answer. I get answer From this Link

http://objectivecwithsuraj.blogspot.in/2014/01/unique-identifier-uuid-ios.html

我使用 FDKeyChain 并编写以下代码以在 KeyChain 中保存 UUID

i use FDKeyChain and Write Following Code to Save UUID In KeyChain

只需定义两个字符串,例如

Just Define Two String like as

static NSString * const KeychainItem_Service = @"FDKeychain";
static NSString * const KeychainItem_UUID = @"Local";

对于获取 UUID,我写为

and For Get UUID I write as

uniqueIdentifier=[self generateUUID];
-(NSString *)generateUUID {
NSString *CFUUID = nil;

if (![FDKeychain itemForKey: KeychainItem_UUID
                 forService: KeychainItem_Service
                      error: nil]) {
    CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault);

    CFUUID = (NSString *)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, uuid));

    [FDKeychain saveItem: CFUUID
                  forKey: KeychainItem_UUID
              forService: KeychainItem_Service
                   error: nil];

} else {
    CFUUID = [FDKeychain itemForKey: KeychainItem_UUID
                         forService: KeychainItem_Service
                              error: nil];
}

return CFUUID;

}

希望对某人有所帮助.如果我的回答有问题,请给我解决方案.谢谢回复.

Hope it Help to SomeOne. and if i do some fault in my answer then please give me solution. Thanks For reply.

这篇关于如何在钥匙串 iOS 中保存 UUID?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆