title: Saving Email/Password to Keychain in iOS
body: <p>I'm very new to iOS development so forgive me if this is a newbie question.  I have a simple authentication mechanism for my app that takes a user's email address and password.  I also have a switch that says 'Remember me'.  If the user toggles that switch on, I'd like to preserve their email/password so those fields can be auto-populated in the future.</p>
  
  <p>I've gotten this to work with saving to a plist file but I know that's not the best idea since the password is unencrypted.  I found some sample code for saving to the keychain, but to be honest, I'm a little lost.  For the function below, I'm not sure how to call it and how to modify it to save the email address as well.  </p>
  
  <p>I'm guessing to call it would be:  <code>saveString(@"passwordgoeshere");</code>  </p>
  
  <p>Thank you for any help!!!</p>
  
  <pre><code>+ (void)saveString:(NSString *)inputString forKey:(NSString *)account {
  
      NSAssert(account != nil, @"Invalid account");
      NSAssert(inputString != nil, @"Invalid string");
  
      NSMutableDictionary *query = [NSMutableDictionary dictionary];
  
      [query setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass];
      [query setObject:account forKey:(id)kSecAttrAccount];
      [query setObject:(id)kSecAttrAccessibleWhenUnlocked forKey:(id)kSecAttrAccessible];
  
      OSStatus error = SecItemCopyMatching((CFDictionaryRef)query, NULL);
      if (error == errSecSuccess) {
          // do update
          NSDictionary *attributesToUpdate = [NSDictionary dictionaryWithObject:[inputString dataUsingEncoding:NSUTF8StringEncoding] 
                                                                        forKey:(id)kSecValueData];
  
          error = SecItemUpdate((CFDictionaryRef)query, (CFDictionaryRef)attributesToUpdate);
          NSAssert1(error == errSecSuccess, @"SecItemUpdate failed: %d", error);
      } else if (error == errSecItemNotFound) {
          // do add
          [query setObject:[inputString dataUsingEncoding:NSUTF8StringEncoding] forKey:(id)kSecValueData];
  
          error = SecItemAdd((CFDictionaryRef)query, NULL);
          NSAssert1(error == errSecSuccess, @"SecItemAdd failed: %d", error);
      } else {
          NSAssert1(NO, @"SecItemCopyMatching failed: %d", error);
      }
  }
  </code></pre>