WHKeyChain.m 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. //
  2. // WHKeyChain.m
  3. // MSYOUPAI
  4. //
  5. // Created by 刘必果 on 2024/2/19.
  6. // Copyright © 2024 MS. All rights reserved.
  7. //
  8. #import "WHKeyChain.h"
  9. @implementation WHKeyChain
  10. +(NSMutableDictionary *)getKeychinaQuery:(NSString *)service{
  11. return [NSMutableDictionary dictionaryWithObjectsAndKeys:(id)kSecClassGenericPassword, (id)kSecClass, service, (id)kSecAttrService, service, (id)kSecAttrAccount, (id)kSecAttrAccessibleAfterFirstUnlock, (id)kSecAttrAccessible, nil];
  12. }
  13. #pragma mark -- 写入
  14. +(void)save:(NSString *)service data:(id)data{
  15. //Get search dictionary
  16. NSMutableDictionary *keyChinaQuery = [self getKeychinaQuery:service];
  17. //Delete old item before add new item
  18. SecItemDelete((CFDictionaryRef)keyChinaQuery);
  19. //Add new object to search dictionary(Attention:the data format)
  20. [keyChinaQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(id)kSecValueData];
  21. //Add item to keychain with the search dictionary
  22. SecItemAdd((CFDictionaryRef)keyChinaQuery, NULL);
  23. }
  24. #pragma mark -- 读取
  25. + (id)load:(NSString *)service{
  26. id ret = nil;
  27. NSMutableDictionary *keychinaQuery = [self getKeychinaQuery:service];
  28. //Configure the search setting
  29. //Since in our simple case we are expecting only a single attribute to be returned (the password) we can set the attribute kSecReturnData to kCFBooleanTrue
  30. [keychinaQuery setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData];
  31. [keychinaQuery setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit];
  32. CFDataRef keyData = NULL;
  33. if (SecItemCopyMatching((CFDictionaryRef)keychinaQuery, (CFTypeRef *)&keyData) == noErr) {
  34. @try {
  35. ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData *)keyData];
  36. } @catch (NSException *e) {
  37. NSLog(@"Unarchive of %@ failed: %@", service, e);
  38. } @finally {
  39. }
  40. }
  41. if (keyData)
  42. CFRelease(keyData);
  43. return ret;
  44. }
  45. #pragma mark -- 删除
  46. +(void)deleteSource:(NSString *)service{
  47. NSMutableDictionary *keychinaQuery = [self getKeychinaQuery:service];
  48. SecItemDelete((CFDictionaryRef)keychinaQuery);
  49. }
  50. @end