gpt4 book ai didi

ios - NSUserDefaults 和 iOS 框架/库

转载 作者:技术小花猫 更新时间:2023-10-29 10:54:10 27 4
gpt4 key购买 nike

我最近一直在使用 [NSUserDefaults standartdUserDefaults] 构建一个应用程序来在本地存储各种信息(关于 session 、用户偏好等)。

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

我正在生成一个 MyKit.framework 和 MyKit.bundle 以导入第三方应用程序(该包包含 Storyboard、Localizable.strings 和 .xcassets)。

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

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

- initWithSuiteName: 是合适的解决方法吗?我可以给 NSUserDefaults 一个范围吗?我应该创建一个包装器来访问自定义 NSUserDefaults 域吗?

最佳答案

我自己也在处理同样的问题。

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

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

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

您可以在 SDK 的 bundle 中拥有一些 .plist 资源,称为“factoryDe​​faults.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,您可以根据需要更新它们,并且仍然保持您的托管应用程序的默认值干净利落。

可以隐藏在 NSUserDefaults standardDefaults 中挖掘 SDK 的单个条目的麻烦,在一个类中,该类将有点覆盖 NSUserDefaults 函数,并将访问 SDK 的条目而不是顶级 standardDefaults。

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

关于ios - NSUserDefaults 和 iOS 框架/库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30087085/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com