iOS 8昨天披露了一个与应用程序组有关的新API。在应用之间共享数据并进行通信之前,情况有点混乱,我相信这正是应用组要纠正的问题。
在我的应用程序中,我启用了应用程序组并添加了一个新的组,但是我找不到有关如何使用它的任何文档。文档和API参考仅说明如何添加组。
那么App Group真正打算做什么?是否有任何有关如何使用它的文档?
Answers:
应用程序组的另一个好处是可以共享NSUserDefaults
数据库。这也适用于App Extensions(通知中心小部件,自定义键盘等)。
NSUserDefaults
在应用组中的所有应用中像这样初始化您的对象,它们将共享数据库:
目标C:
[[NSUserDefaults alloc] initWithSuiteName:@"<group identifier>"];
迅速:
NSUserDefaults(suiteName: "<group identifier>")
请记住[NSUserDefaults standardUserDefaults]
,每个应用程序数据库中的所有内容都不会继承到该数据库中。
该文档还提供了正确的示例(自Beta 3开始)。
并且不要忘记同步数据库:
[yourDefaults synchronize];
在多个应用程序之间共享NSUserDefaults数据
为了在一个应用程序和一个扩展程序或两个应用程序之间共享默认值,您必须使用以下步骤在设置中添加一个应用程序组:
注意:如果您访问Apple Developer Portal(Apple网站显示所有证书,标识符,设备和供应配置文件),然后转到“标识符”>“应用程序组”,则应该看到此新的应用程序组。
要存储数据:
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")!
userDefaults.setObject("user12345", forKey: "userId")
userDefaults.synchronize()
要检索数据:
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")
if let testUserId = userDefaults?.objectForKey("userId") as? String {
print("User Id: \(testUserId)")
}
根据我对现有文档的解释,应用程序组主要针对扩展,尤其是窗口小部件。小部件是与应用程序共存的自己的应用程序包。由于它们是单独的应用程序,因此具有自己的沙箱,因此您需要使用应用程序组共享文件。
经过一些头文件复制后,我认为我找到了所需的API,但实际上是作为iOS 7的一部分放入的。
NSFileManager
上面有一个方法containerURLForSecurityApplicationGroupIdentifier:
,您可以在其中为打开应用程序的应用程序组时传入创建的标识符:
NSURL *containerURL = [[NSFileManager defaultManager]
containerURLForSecurityApplicationGroupIdentifier:@"group.com.company.app"];
NSUserDefaults
上班。我总结了Beta 1错误。
NSUserDefaults
数据库没有解决方法。看我的答案。
我今天探讨的一个重要陷阱是:
在许多项目中,我看到了一个应用程序目标,并为该目标的每种配置设置了不同的包标识符。事情变得混乱了。开发人员打算为调试配置创建调试应用程序,为发布目标创建生产应用程序。
如果这样做,则两个应用程序在设置时将共享相同的NSUserDefaults
var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")
userDefaults!.setObject("user12345", forKey: "userId")
userDefaults!.synchronize()
这会在许多地方引起问题:
通常,解决此问题的方法是在默认键之前添加当前构建的配置。您可以通过为配置设置不同的捆绑标识符来在运行时轻松检测配置。然后只需从中读取包标识符NSBundle.mainBundle()
。如果您具有相同的包标识符,则需要设置不同的预处理器宏,例如
#ifdef DEBUG
NSString* configuration = @"debug";
#elif RELEASE
NSString* configuration = @"release";
#endif
在Swift中,外观几乎相同:
#if DEBUG
let configuration = "debug"
#elseif RELEASE
let configuration = "release"
#endif
NSUserDefaults.standardUserDefaults()
不应共享的数据。