Ага, NSUserDefaults, кажется, работает, и прост в использовании, , но не безопасен в малейшем :
password
IBOutlet для UITextField.
- (void)viewWillAppear:(BOOL)animated
{
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSString *pword = [prefs objectForKey:@"password"];
password.text = uname;
}
- (void)viewWillDisappear:(BOOL)animated{
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setObject:password.text forKey:@"password"];
}
пароль хранится в простом тексте в plist, таким образом, это было бы довольно легко для кого-то еще к доступу.. но это полезно для хранения нечувствительных настроек.
я закончил тем, что использовал это для хранения имя пользователя поле и сохранил пароль с помощью код связки ключей SFHFKeychainUtils из ответа в августе.
К сожалению, нет способа контролировать десериализацию значений перечисления ... В качестве обходного пути вы можете сериализовать значения перечисления в виде строки:
[XmlIgnore]
public MyEnum MyProperty { get; set; }
[XmlElement("MyProperty")]
public string MyPropertyAsString
{
get
{
return EnumToString(MyProperty);
}
set
{
MyProperty = StringToEnum<MyEnum>(value);
}
}
public T StringToEnum<T>(string stringValue)
{
// Manually convert the string to enum, ignoring unknown values
}
public string EnumToString<T>(T enumValue)
{
// Convert the enum to a string
}
Вы можете сделать так, чтобы производящее приложение знало о нескольких версиях потребляющих приложений и использовало разные пространства имен, как XML, так и C #, для каждой из версий. Между приложениями должна быть некоторая предварительная координация, чтобы договориться о схеме, которой они будут следовать, и существует дополнительная ответственность на производящее приложение, чтобы оно оставалось обратно совместимым со всеми возможными активными потребительскими приложениями.
используйте настраиваемую сериализацию c # с управлением версиями объектов; это позволит вам справиться с различными ситуациями, которые возникают, когда одно приложение обновляется, а другое нет