iOS的8昨日透露有关应用程序组的新API。 这是一种杂乱之前共享数据和应用程序之间的沟通,我相信这正是应用组旨在纠正。
在我的应用我已经启用应用程序组,并增加了新的组,但我无法找到如何使用它的任何文件。 文档和API引用仅说明如何添加组。
那么,什么是应用程序组真的打算做什么? 是否有任何文件上的某个地方如何使用它?
iOS的8昨日透露有关应用程序组的新API。 这是一种杂乱之前共享数据和应用程序之间的沟通,我相信这正是应用组旨在纠正。
在我的应用我已经启用应用程序组,并增加了新的组,但我无法找到如何使用它的任何文件。 文档和API引用仅说明如何添加组。
那么,什么是应用程序组真的打算做什么? 是否有任何文件上的某个地方如何使用它?
到App组的另一个好处是共享的能力NSUserDefaults
数据库。 这也适用于应用程序扩展(通知中心窗口小部件,自定义键盘等)。
你的初始化NSUserDefaults
对象这样的应用程序组中的所有应用程序,他们将共享数据库:
Objective-C的:
[[NSUserDefaults alloc] initWithSuiteName:@"<group identifier>"];
迅速:
NSUserDefaults(suiteName: "<group identifier>")
请记住,一切从[NSUserDefaults standardUserDefaults]
数据库中的每个应用程序将不会延续到这个数据库中。
该文档给出了正确的示例以及(作为β3的)。
而且不要忘了同步数据库:
[yourDefaults synchronize];
多个应用程序之间共享数据NSUserDefaults的
为了有一个应用程序和扩展之间或2个应用程序之间共享的默认值,你必须使用以下步骤设置添加一个应用程序组:
注意:如果你去苹果开发者门户网站(苹果网站显示你所有的证书,标识符,设备和供应型材)并转到标识>应用组,你应该可以看到这个新的应用程序组。
要存储数据:
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)")
}
应用程序组,根据我现有的文档的解释,主要是针对扩展,更具体地讲,对于小部件。 Widget是与您的应用程序共存自己的应用程序包。 因为它们是独立的应用程序,因此有自己的沙盒,你将需要使用应用程序组共享文件。
一些头grep'ing后,我想我找到所需的API,但实际上是把尽可能的iOS 7的一部分。
NSFileManager
有一个方法就可以了containerURLForSecurityApplicationGroupIdentifier:
在这里你可以在你的应用程序组为您的应用程序打开时所创建的标识符传递:
NSURL *containerURL = [[NSFileManager defaultManager]
containerURLForSecurityApplicationGroupIdentifier:@"group.com.company.app"];
我挖掘到今天的一个重要陷阱如下:
在许多项目中,我看到了一个单一的应用程序的目标,并与该目标的每个配置设置不同的捆绑标识符。 这里的事情变得混乱。 什么开发商意图是创建调试配置和生产应用为公布目标调试应用程序。
如果这样做的应用程序都将分享时,他们成立了像这样的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
在斯威夫特它的外观几乎相同:
#if DEBUG
let configuration = "debug"
#elseif RELEASE
let configuration = "release"
#endif
储藏
let shared: NSUserDefaults = NSUserDefaults(suiteName: "group.abcapp")!
shared.setObject("abc.png", forKey: "favEmoji")
shared.synchronize()