RKUUIDManager.m 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. //
  2. // RKUUIDManager.m
  3. // RKUUIDTest
  4. //
  5. // Created by YunBao on 2018/11/27.
  6. // Copyright © 2018年 Rookie. All rights reserved.
  7. //
  8. #import "RKUUIDManager.h"
  9. @implementation RKUUIDManager
  10. static NSString * const KEY_IN_KEYCHAIN = @"com.sube.dailycast.uuid";
  11. +(void)saveUUID:(NSString *)uuid {
  12. if (uuid && uuid.length > 0) {
  13. [self save:KEY_IN_KEYCHAIN data:uuid];
  14. }
  15. }
  16. +(NSString *)getUUID {
  17. NSString *uuid = [self load:KEY_IN_KEYCHAIN];
  18. if (!uuid || uuid.length == 0) {
  19. NSString *uuid = [[NSUUID UUID] UUIDString];
  20. [self saveUUID:uuid];
  21. }
  22. return uuid;
  23. }
  24. +(void)deleteUUID {
  25. [self delete:KEY_IN_KEYCHAIN];
  26. }
  27. #pragma mark - private
  28. + (NSMutableDictionary *)getKeychainQuery:(NSString *)service {
  29. return [NSMutableDictionary dictionaryWithObjectsAndKeys:(__bridge_transfer id)kSecClassGenericPassword,(__bridge_transfer id)kSecClass,
  30. service, (__bridge_transfer id)kSecAttrService,
  31. service, (__bridge_transfer id)kSecAttrAccount,
  32. (__bridge_transfer id)kSecAttrAccessibleAfterFirstUnlock, (__bridge_transfer id)kSecAttrAccessible, nil];
  33. }
  34. + (void)save:(NSString *)service data:(id)data {
  35. //Get search dictionary
  36. NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
  37. //Delete old item before add new item
  38. SecItemDelete((__bridge_retained CFDictionaryRef)keychainQuery);
  39. //Add new object to search dictionary(Attention:the data format)
  40. [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__bridge_transfer id)kSecValueData];
  41. //Add item to keychain with the search dictionary
  42. SecItemAdd((__bridge_retained CFDictionaryRef)keychainQuery, NULL);
  43. }
  44. + (id)load:(NSString *)service {
  45. id ret = nil;
  46. NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
  47. //Configure the search setting
  48. [keychainQuery setObject:(id)kCFBooleanTrue forKey:(__bridge_transfer id)kSecReturnData];
  49. [keychainQuery setObject:(__bridge_transfer id)kSecMatchLimitOne forKey:(__bridge_transfer id)kSecMatchLimit];
  50. CFDataRef keyData = NULL;
  51. if (SecItemCopyMatching((__bridge_retained CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {
  52. @try {
  53. ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge_transfer NSData *)keyData];
  54. } @catch (NSException *e) {
  55. NSLog(@"Unarchive of %@ failed: %@", service, e);
  56. } @finally {
  57. }
  58. }
  59. return ret;
  60. }
  61. + (void)delete:(NSString *)service {
  62. NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
  63. SecItemDelete((__bridge_retained CFDictionaryRef)keychainQuery);
  64. }
  65. @end