2016-12-12 17 views
2

我需要存儲的用戶名和密碼值到鑰匙扣,下次如果我想存儲與密碼新的用戶名,如果用戶名已存在它顯示我的消息,但如果用戶名不同,它應該存儲它。 以下是我的代碼 我能夠儲存,但沒有得到如何檢查特定的用戶名。檢查特定的用戶名退出與否如果沒有,那麼存儲新用戶密碼IOS objcetive-C

+(bool)CheckValuesInKeyChainWithUsername:(NSString*)username 
{ 

NSDictionary* dictSearch = [NSDictionary dictionaryWithObjectsAndKeys:(__bridge id)(kSecClassInternetPassword), kSecClass, kCFBooleanTrue, kSecReturnAttributes, kCFBooleanTrue, kSecReturnData, nil]; 
NSDictionary* found = nil; 
CFDictionaryRef foundCF; 
OSStatus errOS = SecItemCopyMatching((__bridge CFDictionaryRef) dictSearch, (CFTypeRef*)&foundCF); 
NSLog(@"%d",(int)errOS); 
found = (__bridge NSDictionary*)(foundCF); 
if (!found) 
{ 
    return false; 
} 
return true; 
} 


+(void)SaveUsername:(NSString*)user withPassword:(NSString*)pass 
{ 

// Create dictionary of parameters to add 
NSData* passwordData = [pass dataUsingEncoding:NSUTF8StringEncoding]; 
NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:(__bridge id)(kSecClassInternetPassword), kSecClass, passwordData, kSecValueData, user, kSecAttrAccount, nil]; 

// Try to save to keychain 
OSStatus errOS = SecItemAdd((__bridge CFDictionaryRef) dict, NULL); 
NSLog(@"Error Code: %d", (int)errOS); 

} 

回答

0
+(bool)CheckUserNameExistsOrNot 
{ 
NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:(__bridge id)(kSecClassInternetPassword), kSecClass, serviceName, kSecAttrServer, kCFBooleanTrue, kSecReturnAttributes, kCFBooleanTrue, kSecReturnData, nil]; 

// Look up in the keychain 
CFDictionaryRef foundCF; 
OSStatus err = SecItemCopyMatching((__bridge CFDictionaryRef) dict, (CFTypeRef*)&foundCF); 
if (err == errSecItemNotFound) 
{ 
    return false; 
} 

return true; 

} 
+(bool)CheckIfInputsArePerfect:(NSString*)username ansPassword:(NSString*)password 
{ 
NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:(__bridge id)(kSecClassInternetPassword), kSecClass, serviceName, kSecAttrServer, kCFBooleanTrue, kSecReturnAttributes, kCFBooleanTrue, kSecReturnData, nil]; 

// Look up in the keychain 
NSDictionary* found = nil; 
CFDictionaryRef foundCF; 
OSStatus err = SecItemCopyMatching((__bridge CFDictionaryRef) dict, (CFTypeRef*)&foundCF); 
if (err == errSecItemNotFound) 
{ 
    return false; 
} 

found = (__bridge NSDictionary*)(foundCF); 

// Found 
NSString* user = (NSString*) [found objectForKey:(__bridge id)(kSecAttrAccount)]; 
NSString* pass = [[NSString alloc] initWithData:[found objectForKey:(__bridge id)(kSecValueData)] encoding:NSUTF8StringEncoding]; 

NSLog(@"User Name :%@ and password %@",user,pass); 
if([user isEqualToString:username] && [pass isEqualToString:password]){ 
    return true; 
} 
return false; 
} 

+(void)RemoveKeyChain 
{ 
// Create dictionary of search parameters 
NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:(__bridge id)(kSecClassInternetPassword), kSecClass, serviceName, kSecAttrServer, kCFBooleanTrue, kSecReturnAttributes, kCFBooleanTrue, kSecReturnData, nil]; 

// Remove any old values from the keychain 
OSStatus err = SecItemDelete((__bridge CFDictionaryRef) dict); 
NSLog(@"%d",(int)err); 
} 
+(void)SaveUsername:(NSString*)user withPassword:(NSString*)pass { 


NSDictionary* dict ;//= [NSDictionary dictionaryWithObjectsAndKeys:(__bridge id)(kSecClassInternetPassword), kSecClass, serviceName, kSecAttrServer, kCFBooleanTrue, kSecReturnAttributes, nil]; 

// Remove any old values from the keychain 
OSStatus err;// = SecItemDelete((__bridge CFDictionaryRef) dict); 

// Create dictionary of parameters to add 
NSData* passwordData = [pass dataUsingEncoding:NSUTF8StringEncoding]; 
dict = [NSDictionary dictionaryWithObjectsAndKeys:(__bridge id)(kSecClassInternetPassword), kSecClass, serviceName, kSecAttrServer, passwordData, kSecValueData, user, kSecAttrAccount, nil]; 

// Try to save to keychain 
err = SecItemAdd((__bridge CFDictionaryRef) dict, NULL);           
NSLog(@"Error Code: %d", (int)err); 

} 
1

這裏有一個測試代碼。 你需要設置字典是可變的,也檢查你的情況爲無效的參數(errOS == errSecPara)。

+(bool)CheckValuesInKeyChainWithUsername:(NSString*)username 
{ 

    NSMutableDictionary* dictSearch = [[NSMutableDictionary alloc]init]; 

    [dictSearch setObject:(__bridge id)kSecClassGenericPassword 
           forKey:(__bridge id)kSecClass]; 

    [dictSearch setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit]; 

    [dictSearch setObject:(__bridge id)kCFBooleanTrue 
           forKey:(__bridge id)kSecReturnAttributes]; 


    [dictSearch setObject:username forKey:(__bridge id)kSecAttrAccount]; 

    /* 
    Unique string used to identify the keychain item: 
    //static const UInt8 kKeychainItemIdentifier[] = "com.company.MyApp"; 


    NSData *keychainItemID = [NSData dataWithBytes:kKeychainItemIdentifier 
              length:strlen((const char *)kKeychainItemIdentifier)]; 

    [dictSearch setObject:keychainItemID forKey:(__bridge id)kSecAttrGeneric]; 
    */ 

    NSMutableDictionary* found = nil; 
    CFMutableDictionaryRef foundCF = nil; 
    OSStatus errOS = noErr; 
    errOS = SecItemCopyMatching((__bridge CFDictionaryRef) dictSearch, (CFTypeRef*)&foundCF); 
    NSLog(@"%d",(int)errOS); 


    if (errOS == errSecItemNotFound) 
    { 
     return false; 

    }else if (errOS == noErr) 
    { 
     found = (__bridge NSMutableDictionary*)(foundCF); 
     return true; 
    } 

    return false; 
} 
+0

Idali你好是有什麼錯在我的代碼! –

+1

我開始用你的代碼,但得到與缺少參數(-50)也需要使用可變dictionnary錯誤....我一步步的一個改變你dictionnary初始化。 – Idali

+0

非常感謝!你有在設備上測試過嗎?因爲我沒有設備。 –