KeyChainTools.m 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. //
  2. // KeyChainTools.m
  3. // TeacherDaya
  4. //
  5. // Created by Kyle on 2020/12/24.
  6. // Copyright © 2020 DayaMusic. All rights reserved.
  7. //
  8. #import "KeyChainTools.h"
  9. #import <Security/Security.h>
  10. NSString *const KEY_ASSESSGROUP = @"B2AP53HHTU.Colexiu";
  11. @implementation KeyChainTools
  12. + (NSString *)getUUID {
  13. //定义存入keychain中的账号 也就是一个标识 表示是某个app存储的内容 bundle id就好
  14. NSString * const KEY_UUID = @"com.Colexiu.Kulexiu.UUID";
  15. // 测试用 清除keychain中的内容
  16. // [self delete:KEY_UUID];
  17. //读取UUID
  18. NSMutableDictionary *readUUID = (NSMutableDictionary *)[self load:KEY_UUID];
  19. //NSLog(@"keychain------><>%@",readUserPwd);
  20. if (!readUUID) {
  21. //如果为空 说明是第一次安装 做存储操作
  22. NSString *identifierStr = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
  23. identifierStr = [NSString stringToMD5:identifierStr];
  24. //NSLog(@"identifierStr-----><>%@",identifierStr);
  25. NSMutableDictionary *uuidDic = [NSMutableDictionary dictionaryWithObject:identifierStr forKey:KEY_UUID];
  26. [self save:KEY_UUID data:uuidDic];
  27. if (SUBMIT_UUID) {
  28. return identifierStr;
  29. }
  30. else {
  31. return nil;
  32. }
  33. }else{
  34. if (SUBMIT_UUID) {
  35. return [readUUID objectForKey:KEY_UUID];
  36. }
  37. else {
  38. return @"";
  39. }
  40. }
  41. }
  42. //储存
  43. + (void)save:(NSString *)service data:(id)data {
  44. //Get search dictionary
  45. NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
  46. //Delete old item before add new item
  47. SecItemDelete((__bridge CFDictionaryRef)keychainQuery);
  48. //Add new object to search dictionary(Attention:the data format)
  49. [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__bridge id)kSecValueData];
  50. //Add item to keychain with the search dictionary
  51. OSStatus status = SecItemAdd((__bridge CFDictionaryRef)keychainQuery, NULL);
  52. NSLog(@"---%d", status);
  53. }
  54. + (NSMutableDictionary *)getKeychainQuery:(NSString *)service {
  55. return [NSMutableDictionary dictionaryWithObjectsAndKeys:
  56. (__bridge id)kSecClassGenericPassword,(__bridge id)kSecClass,
  57. service, (__bridge id)kSecAttrService,
  58. service, (__bridge id)kSecAttrAccount,
  59. KEY_ASSESSGROUP, (__bridge id)kSecAttrAccessGroup,
  60. (__bridge id)kSecAttrAccessibleAfterFirstUnlock,(__bridge id)kSecAttrAccessible,
  61. nil];
  62. }
  63. //取出
  64. + (id)load:(NSString *)service {
  65. id ret = nil;
  66. NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
  67. //Configure the search setting
  68. //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
  69. [keychainQuery setObject:(__bridge id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData];
  70. [keychainQuery setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit];
  71. CFDataRef keyData = NULL;
  72. if (SecItemCopyMatching((__bridge CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {
  73. @try {
  74. ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData *)keyData];
  75. } @catch (NSException *e) {
  76. NSLog(@"Unarchive of %@ failed: %@", service, e);
  77. } @finally {
  78. }
  79. }
  80. if (keyData)
  81. CFRelease(keyData);
  82. return ret;
  83. }
  84. //删除
  85. + (void)delete:(NSString *)service {
  86. NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
  87. SecItemDelete((__bridge CFDictionaryRef)keychainQuery);
  88. }
  89. @end