// // KeychainHelper.m // VclustersGemini // // Created by xd h on 2025/9/22. // Copyright © 2025 APPLE. All rights reserved. // #import "KeychainHelper.h" #import @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