JLChen
2021-04-30 a5247b61d585627a1a7b1e1f35f34de9f0af9fba
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
//
//  Copyright (c) 2015年 Anson. All rights reserved.
//
 
#import "LCUDIDTool.h"
 
#define LAUDIDKEY_EXTENTION_FLAG @"LAUDID-KEY"
@interface LCUDIDTool()
{
    NSString *_udid;
}
@end
 
@implementation LCUDIDTool
 
static LCUDIDTool *oneInstance;
+ (instancetype)shareInstance
{
    @synchronized(self) {
        
        if (oneInstance == nil) {
            oneInstance = [[self alloc]init];
        }
    }
    return oneInstance;
}
 
//储存keyChain
- (void)saveKey:(NSString *)service value:(NSString *)value {
    //Get search dictionary
    NSMutableDictionary *keychainQuery = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                          (__bridge_transfer id)kSecClassGenericPassword,(__bridge_transfer id)kSecClass,
                                          service, (__bridge_transfer id)kSecAttrService,
                                          service, (__bridge_transfer id)kSecAttrAccount,
                                          (__bridge_transfer id)kSecAttrAccessibleAfterFirstUnlock,(__bridge_transfer id)kSecAttrAccessible,
                                          nil];
    CFDictionaryRef keychainQueryRef = (__bridge_retained CFDictionaryRef)keychainQuery;
    
    //Delete old item before add new item
    SecItemDelete(keychainQueryRef);
    //Add new object to search dictionary(Attention:the data format)
    [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:value] forKey:(__bridge_transfer id)kSecValueData];
    //Add item to keychain with the search dictionary
    SecItemAdd(keychainQueryRef, NULL);
    CFRelease(keychainQueryRef);
    
}
 
//获取keyChain
- (NSString *)getWithKey:(NSString *)service {
    NSString *ret = nil;
    NSMutableDictionary *keychainQuery = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                          (__bridge_transfer id)kSecClassGenericPassword,(__bridge_transfer id)kSecClass,
                                          service, (__bridge_transfer id)kSecAttrService,
                                          service, (__bridge_transfer id)kSecAttrAccount,
                                          (__bridge_transfer id)kSecAttrAccessibleAfterFirstUnlock,(__bridge_transfer id)kSecAttrAccessible,
                                          nil];
    //Configure the search setting
    [keychainQuery setObject:(id)kCFBooleanTrue forKey:(__bridge_transfer id)kSecReturnData];
    [keychainQuery setObject:(__bridge_transfer id)kSecMatchLimitOne forKey:(__bridge_transfer id)kSecMatchLimit];
    CFDataRef keyData = NULL;
    if (SecItemCopyMatching((__bridge_retained CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {
        @try {
            ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge_transfer NSData *)keyData];
        } @catch (NSException *e) {
            NSLog(@"Unarchive of %@ failed: %@", service, e);
        } @finally {
        }
    }
    return ret;
}
 
 
#pragma mark -
#pragma mark UUIDString
- (NSString *)UDIDString
{
    if(_udid!=nil)
    {
        return _udid;
    }
    
    //根据bundleID 生产一个UDID_KEY
    //从keychain中取出对应UDID_KEY的值 如果没有那么生产一个随机的UUID 写入keychain 并返回
    
    NSString *bundleID = [[NSBundle mainBundle] bundleIdentifier];
    NSString *UDID_KEY = [NSString stringWithFormat:@"%@-%@",LAUDIDKEY_EXTENTION_FLAG, bundleID];
 
    NSString *uuidString ;
    
    @try
    {
        uuidString = [self getWithKey:UDID_KEY];
    }
    @catch (NSException *exception)
    {
        return nil;
    }
    @finally
    {
        
    }
    
    if(uuidString && [uuidString length])
    {
        _udid = uuidString;
        NSLog(@"-%@", uuidString);
        return uuidString;
    }
    
    
    @try
    {
        CFUUIDRef uuidRef = CFUUIDCreate(nil);
        CFStringRef stringRef = CFUUIDCreateString(nil, uuidRef);
        uuidString = (NSString *)CFBridgingRelease(CFStringCreateCopy(nil, stringRef));
        CFRelease(uuidRef);
        CFRelease(stringRef);
        
        [self saveKey:UDID_KEY value:uuidString];
        _udid = uuidString;
        return uuidString ;
    }
    @catch (NSException *exception)
    {
        return nil;
    }
 
}
@end