NSUserDefaults和iOS框架/库

13

我最近正在使用[NSUserDefaults standardUserDefaults]来存储各种信息(关于会话、用户偏好等)以构建一个应用程序。

现在我将项目的一部分导出为iOS框架(目标是创建一个SDK)。

我正在生成MyKit.framework和MyKit.bundle以便能够在第三方应用程序中导入(bundle包含故事板、本地化字符串和.xcassets文件)。

目前,我已经确保MyKit.framework使用的资源是从MyKit.bundle范围加载而不是[NSBundle mainBundle],以避免与第三方应用程序的资源冲突。

现在,如果某些键在框架和目标应用程序之间共享,NSUserDefault也可能导致冲突。

是否- initWithSuiteName:是适当的解决方法? 我能否为NSUserDefaults指定作用域? 我应该创建一个包装器来访问自定义的NSUserDefaults域吗?


4
为什么不使用NSUserDefaults standardUserDefaults呢?只需要确保所有的键看起来都像这样:@"com.mydomain.frameworkname.keyname",这样就不会发生冲突。 - rmaddy
1
我相信 initWithSuite 主要是用于在应用程序组中共享默认设置。 - JamesSugrue
@maddy 但是你的初始值从哪里获取呢?难道托管应用程序(针对你的框架-SDK构建)应该包含一个资源来支持你的SDK吗?那不是很丑陋吗? - Motti Shneor
1个回答

0

我也在处理同样的问题。

目前我的观察是,由于NSUserDefaults standardDefault包含一个对象层次结构(类似于.plist),您可以将所有SDK的默认键/值放入某个“Dictionary”条目中(例如,以您的SDK域命名 - “com.mydomain.frameworkname”)。这将为您的项目设置专用的项并使它们与应用程序自己的值区分开来。

这里有一个缺点 - KVO仅适用于顶层键/值更改,因此您无法直接“注册”对NSUserDefaults中默认值的更改。

然后,还有一部分是将SDK的“出厂默认值”第一次加载到NSUserDefaults standardDefaults中。为此,有一个称为“registerDefaults”的标准行为和API。

您可以在SDK的束中拥有一些.plist资源,名为“factoryDefaults.plist”,然后在SDK的初始化中执行以下操作:

NSString *path = [[NSBundle bundleForClass:[self class]] pathForResource:@"factoryDefaults" ofType:@"plist"];
NSDictionary* factorySettings = [NSDictionary dictionaryWithContentsOfFile:path];
[[NSUserDefaults standardDefaults] registerDefaults:factorySettings];
[[NSUserDefaults standardDefaults] synchronize];

然后,您可以继续使用默认值进行工作,使用标准用户默认API更新它们(如有需要),并仍然保持您的托管应用程序的默认值干净。

可以通过创建一个类来隐藏挖掘SDK在NSUserDefaults standardDefaults中的单个条目的麻烦,并将其替换为访问SDK条目而不是顶级standardDefaults。

注意:我现在只是在尝试这个方法-还不能报告成功。因此,我将感谢任何批评和建议,并欢迎您尝试此方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接