与App应用程序组之间的沟通和持久化数据与App应用程序组之间的沟通和持久化数据(Communica

2019-05-09 05:39发布

iOS的8昨日透露有关应用程序组的新API。 这是一种杂乱之前共享数据和应用程序之间的沟通,我相信这正是应用组旨在纠正。

在我的应用我已经启用应用程序组,并增加了新的组,但我无法找到如何使用它的任何文件。 文档和API引用仅说明如何添加组。

那么,什么是应用程序组真的打算做什么? 是否有任何文件上的某个地方如何使用它?

Answer 1:

到App组的另一个好处是共享的能力NSUserDefaults数据库。 这也适用于应用程序扩展(通知中心窗口小部件,自定义键盘等)。

你的初始化NSUserDefaults对象这样的应用程序组中的所有应用程序,他们将共享数据库:

Objective-C的:

[[NSUserDefaults alloc] initWithSuiteName:@"<group identifier>"];

迅速:

NSUserDefaults(suiteName: "<group identifier>")

请记住,一切从[NSUserDefaults standardUserDefaults]数据库中的每个应用程序将不会延续到这个数据库中。

该文档给出了正确的示例以及(作为β3的)。

而且不要忘了同步数据库:

[yourDefaults synchronize];


Answer 2:

多个应用程序之间共享数据NSUserDefaults的

为了有一个应用程序和扩展之间或2个应用程序之间共享的默认值,你必须使用以下步骤设置添加一个应用程序组:

  1. 在Project Navigator点击* .xcodeproj文件(应该是在顶部)。
  2. 到Project Navigator右侧寻找项目和目标。 在目标点击你的主要目标(应当根据目标的第一件事)。
  3. 接近顶部,单击功能选项卡上。
  4. 在应用程序组部分按一下开关,打开应用程序组在右边。
  5. 点击+按钮,添加一个名为group.com.company.myApp的应用程序组。
  6. 去同一个地方在你的其他应用程序,这组现在应该可以进行选择。 打开该组上为将要使用该共享数据的每个应用程序。

注意:如果你去苹果开发者门户网站(苹果网站显示你所有的证书,标识符,设备和供应型材)并转到标识>应用组,你应该可以看到这个新的应用程序组。

要存储数据:

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)")
}


Answer 3:

应用程序组,根据我现有的文档的解释,主要是针对扩展,更具体地讲,对于小部件。 Widget是与您的应用程序共存自己的应用程序包。 因为它们是独立的应用程序,因此有自己的沙盒,你将需要使用应用程序组共享文件。

一些头grep'ing后,我想我找到所需的API,但实际上是把尽可能的iOS 7的一部分。

NSFileManager有一个方法就可以了containerURLForSecurityApplicationGroupIdentifier:在这里你可以在你的应用程序组为您的应用程序打开时所创建的标识符传递:

NSURL *containerURL = [[NSFileManager defaultManager] 
           containerURLForSecurityApplicationGroupIdentifier:@"group.com.company.app"];


Answer 4:

我挖掘到今天的一个重要陷阱如下:

在许多项目中,我看到了一个单一的应用程序的目标,并与该目标的每个配置设置不同的捆绑标识符。 这里的事情变得混乱。 什么开发商意图是创建调试配置和生产应用为公布目标调试应用程序。

如果这样做的应用程序都将分享时,他们成立了像这样的NSUserDefaults的一样

var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")
userDefaults!.setObject("user12345", forKey: "userId")
userDefaults!.synchronize()

这导致很多地方的问题:

  1. 想象一下,你的一键设定是当一个特殊的应用程序的开场画面已经显示给用户。 其他的应用程序现在也可以读YES和不显示的介绍。
  2. 有一些应用程序OAuth符也存储在他们的用户默认设置。 反正...取决于实现方式,应用程序将认识到,有一个令牌,并开始使用错误的令牌检索数据。 机会是很高,这将失败,并奇怪的错误。

在一般这个问题的方法是使用内置的当前配置的前缀默认密钥。 你可以为你的配置设置不同的捆绑标识符在运行时容易检测的配置。 然后,只需读取束标识符NSBundle.mainBundle() 如果你有同样的包标识符需要设置不同的预处理宏象

#ifdef DEBUG
  NSString* configuration = @"debug";
#elif RELEASE
  NSString* configuration = @"release";
#endif

在斯威夫特它的外观几乎相同:

#if DEBUG
  let configuration = "debug"
#elseif RELEASE
  let configuration = "release"
#endif


Answer 5:

储藏

let shared: NSUserDefaults = NSUserDefaults(suiteName: "group.abcapp")!
shared.setObject("abc.png", forKey: "favEmoji")
shared.synchronize()


文章来源: Communicating and persisting data between apps with App Groups