| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- //
- // KeychainHelper.m
- // VclustersGemini
- //
- // Created by xd h on 2025/9/22.
- // Copyright © 2025 APPLE. All rights reserved.
- //
- #import "KeychainHelper.h"
- #import <Security/Security.h>
- @implementation KeychainHelper
- + (NSMutableDictionary *)getKeychainQuery:(NSString *)key {
- return [NSMutableDictionary dictionaryWithObjectsAndKeys:
- (id)kSecClassGenericPassword, (id)kSecClass,
- key, (id)kSecAttrService,
- key, (id)kSecAttrAccount,
- (id)kSecAttrAccessibleAfterFirstUnlock, (id)kSecAttrAccessible,
- nil];
- }
- + (BOOL)saveString:(NSString *)string forKey:(NSString *)key {
- // 先删除已存在的项目
- [self deleteStringForKey:key];
-
- NSMutableDictionary *keychainQuery = [self getKeychainQuery:key];
- NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
- [keychainQuery setObject:data forKey:(id)kSecValueData];
-
- OSStatus status = SecItemAdd((CFDictionaryRef)keychainQuery, NULL);
- return status == errSecSuccess;
- }
- + (NSString *)getStringForKey:(NSString *)key {
- NSString *ret = nil;
- NSMutableDictionary *keychainQuery = [self getKeychainQuery:key];
- [keychainQuery setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData];
- [keychainQuery setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit];
-
- CFDataRef keyData = NULL;
- if (SecItemCopyMatching((CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == errSecSuccess) {
- @try {
- ret = [[NSString alloc] initWithData:(__bridge NSData *)keyData encoding:NSUTF8StringEncoding];
- }
- @catch (NSException *e) {
- NSLog(@"Unarchive of %@ failed: %@", key, e);
- }
- @finally {}
- }
-
- if (keyData) CFRelease(keyData);
- return ret;
- }
- + (BOOL)deleteStringForKey:(NSString *)key {
- NSMutableDictionary *keychainQuery = [self getKeychainQuery:key];
- OSStatus status = SecItemDelete((CFDictionaryRef)keychainQuery);
- return status == errSecSuccess;
- }
- @end
|