2014-06-15 23 views
0

我正在爲iOS 7開發應用程序,並使用ARC。我正在使用Web服務,因此用戶必須使用用戶名和密碼登錄到Web服務。我知道這是不好的,只是存儲用戶名和密碼,所以我想用鑰匙串來存儲用戶名和密碼。如何在iOS 7中使用ARC存儲密碼

經過一番研究,似乎人們建議使用KeychainItemWrapper,但是這與ARC不兼容。我如何使用ARC在iOS 7中使用鑰匙串存儲密碼?任何幫助和指導將不勝感激。

+0

這應該有所幫助 - http://stackoverflow.com/questions/5247912/saving-email-password-to-keychain-in-ios – raurora

回答

2

我使用以下命令:

+ (void)keyChainSaveKey:(NSString *)key data:(id)data 
{ 
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:key]; 
    SecItemDelete((__bridge CFDictionaryRef)keychainQuery); 
    [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__bridge id)kSecValueData]; 
    SecItemAdd((__bridge CFDictionaryRef)keychainQuery, NULL); 
} 

+ (id)keyChainLoadKey:(NSString *)key 
{ 
    id ret = nil; 
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:key]; 
    [keychainQuery setObject:(id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData]; 
    [keychainQuery setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit]; 
    CFDataRef keyData = NULL; 
    if (SecItemCopyMatching((__bridge CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) { 
     @try { 
      ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData *)keyData]; 
     } 
     @catch (NSException *e) { 
      //NS Log(@"Unarchive of %@ failed: %@", service, e); 
     } 
     @finally {} 
    } 
    if (keyData) CFRelease(keyData); 
    return ret; 
} 

+ (void)keyChainDeleteKey:(NSString *)service 
{ 
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; 
    SecItemDelete((__bridge CFDictionaryRef)keychainQuery); 
} 

//helper 
+ (NSMutableDictionary *)getKeychainQuery:(NSString *)key 
{ 
    return [NSMutableDictionary dictionaryWithObjectsAndKeys: 
      (__bridge id)kSecClassGenericPassword, (__bridge id)kSecClass, 
      key, (__bridge id)kSecAttrService, 
      key, (__bridge id)kSecAttrAccount, 
      (__bridge id)kSecAttrAccessibleAfterFirstUnlock, (__bridge id)kSecAttrAccessible, 
      nil]; 
} 

您可能需要

#import <CommonCrypto/CommonCryptor.h> 

我不記得在那裏我發現這個代碼...所以我不能給信貸:(

+0

這工作謝謝! – user2604504