KeyChainHelper.m 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. //
  2. // KeyChainHelper.m
  3. // CommonLibrary
  4. //
  5. // Created by Alexi on 14-2-19.
  6. // Copyright (c) 2014年 CommonLibrary. All rights reserved.
  7. //
  8. #import "KeyChainHelper.h"
  9. #import <Security/Security.h>
  10. #import <Security/SecItem.h>
  11. @implementation KeyChainHelper
  12. + (NSMutableDictionary *)getKeyChainQuery:(NSString *)service
  13. {
  14. return [NSMutableDictionary dictionaryWithObjectsAndKeys:(id)kSecClassGenericPassword,(id)kSecClass, service, (id)kSecAttrService, service, (id)kSecAttrAccount, (id)kSecAttrAccessibleAfterFirstUnlock, (id)kSecAttrAccessible,
  15. nil];
  16. }
  17. + (void)addService:(NSString *)service withKey:(NSString *)key;
  18. {
  19. NSMutableDictionary *keychainQuery = [self getKeyChainQuery:key];
  20. SecItemDelete((CFDictionaryRef)keychainQuery);
  21. [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:service] forKey:(id)kSecValueData];
  22. SecItemAdd((CFDictionaryRef)keychainQuery, NULL);
  23. }
  24. + (NSString *)serviceForKey:(NSString *)key;
  25. {
  26. NSString* ret = nil;
  27. NSMutableDictionary *keychainQuery = [self getKeyChainQuery:key];
  28. [keychainQuery setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData];
  29. [keychainQuery setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit];
  30. CFDataRef keyData = NULL;
  31. if (SecItemCopyMatching((CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr)
  32. {
  33. @try
  34. {
  35. ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData *)keyData];
  36. }
  37. @catch (NSException *e)
  38. {
  39. DebugLog(@"Unarchive of %@ failed: %@", key, e);
  40. }
  41. @finally
  42. {
  43. }
  44. }
  45. if (keyData)
  46. {
  47. CFRelease(keyData);
  48. }
  49. return ret;
  50. }
  51. @end