【问题标题】:Save (Private) Application Settings on iOS?在 iOS 上保存(私有)应用程序设置?
【发布时间】:2011-10-01 04:49:24
【问题描述】:

我知道NSUserDefaults 用于保存/恢复用户首选项。 应用程序的等效类是什么?例如,应用程序可能有一个“上次运行”字段;或者它可能具有用于在应用程序级别使用的设备的唯一标识字段。

我的目的是将应用程序的设置(不是用户的设置)保留在设置应用程序之外,而不是将这些设置备份到 iTunes、Time Machine、{whatever} 中。

Java 和 C# 的噪音很大,但 iOS/iPhone/iPad 的噪音不大。

【问题讨论】:

  • iPhone 是单用户操作系统。您无法使用其他用户名登录。那么为什么需要不同于用户设置的应用程序设置呢?还是我错过了什么?

标签: iphone ios ipad settings


【解决方案1】:

NSUserDefaults 可用于您的要求。

if (![[NSUserDefaults standardUserDefaults] boolForKey:@"shownPrompt"]) {
    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"shownPrompt"];
    // Show your prompt or whatever
}

这是一个工作代码 sn-p。如果键为假,则将其设置为真并显示提示。下次运行此代码时,密钥已为 true,因此不会显示提示。

NSUserDefaults 特定于当前设备上的当前应用程序,与NSMutableDictionary 相似之处在于它是一个键值系统,不同之处在于不是实例化您自己的,而是有一个通用共享实例您的整个应用,在应用退出时不会被删除。

NSUserDefaults 非常适合保存诸如是否已显示某些内容、上次运行的日期等内容。在此处阅读文档:https://developer.apple.com/documentation/foundation/userdefaults

不要被“用户偏好”部分吓到。你可以用它来保存你想要的任何东西(只要它是或可以转换为实现<NSCoding>NSObject,这基本上意味着NSStringNSDictionaryNSArrayNSNumber、@ 987654333@、intfloatbool等)。

澄清一下,您在NSUserDefaults 中输入的内容在任何情况下不会自动出现在“设置”应用中。它将完全保密和隐藏。要让某些内容出现在“设置”中,您需要将设置包添加到您的应用中,并为您希望在“设置”应用中显示的每个值手动添加键。

【讨论】:

  • NightLeopard - 我也希望你的答案也值得称赞,但我不能。我能做的最好的就是竖起大拇指。
  • 确保您在某个时候致电[standardUserDefaults synchronize] 提交更改。
  • @bendytree 根据 Apple 的文档:因为此方法是定期自动调用的,所以仅当您无法等待自动同步时(例如,如果您的应用程序即将退出)或如果你想更新用户默认为磁盘上的内容,即使你没有做任何更改。
  • 这应该是公认的答案。 OP 似乎误解了 UserDefaults (private, app-internal) != Settings bundle (public, user-facing)。
  • 感谢您的详细解释
【解决方案2】:

如果您可以通过 NSUserDefaults 存储值,那么存储应用程序首选项也很好。

或在您的项目中添加 settings.plist 并阅读(您以后不会更改的内容)

你可以使用like.,

+ (NSDictionary*)getBundlePlist:(NSString *)plistName
{
    NSString *errorDesc = nil;
    NSPropertyListFormat format;
    NSString *plistPath = [[NSBundle mainBundle] pathForResource:plistName ofType:@"plist"];
    NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath];
    NSDictionary *temp = (NSDictionary *)[NSPropertyListSerialization
                                          propertyListFromData:plistXML
                                          mutabilityOption:NSPropertyListMutableContainersAndLeaves           
                                          format:&format errorDescription:&errorDesc];
    return temp;
}

+ (id) getPropValue:(NSString *)PropertyName
{   // I am supposing you had add your app preferences on settings.plist.
    return [[Property getBundlePlist:@"settings"] objectForKey:PropertyName];
    //here Property is my class name, then you can use value by 
    //NSString *value = [Property getPropValue:@"setting1"];
}

【讨论】:

  • 或者您可以将所有内容放入数组或字典中并调用writeToFile:
  • 这很好,据我了解您的解决方案,它将在应用程序执行后保存。嗯,我是在告诉他在 IDE 中的 plist 文件中添加值。
【解决方案3】:

很难说出你在问什么。听起来 NSUserDefaults 是您正在寻找的东西,但您声称您已经知道它。那你有什么问题?

【讨论】:

  • 在设备上,某些项目(例如“上次运行”)不应显示在设置应用程序中,也不应备份。我打算将它们保密。
  • @noloader 当你在 NSUserDefaults 中放一些东西时,它会 NOT 自动显示在设置中。要在设置中显示某些内容,您必须专门为您的应用添加一个设置包,并特别为其添加一个设置该值的键。什么都不会自动出现。我一直使用NSUserDefaults,我的应用甚至没有设置包,也没有出现在设置中。
猜你喜欢
  • 2014-07-02
  • 2012-11-17
  • 2010-12-21
  • 2015-05-13
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
  • 2013-06-19
相关资源
最近更新 更多