使用应用程序组在应用程序之间传递和保存数据

时间:2014-06-03 12:43:21

标签: ios objective-c ios8 ios-app-extension

iOS 8昨天发布了一个关于App Groups的新API。在分享数据和在应用程序之间进行通信之前,它有点混乱,我相信这正是App Groups要纠正的内容。

在我的应用程序中,我启用了App Groups并添加了一个新组,但我找不到任何有关如何使用它的文档。文档和API参考仅说明如何添加组。

那么App Group真的打算做什么呢?有没有关于如何使用它的文件?

6 个答案:

答案 0 :(得分:77)

App Groups的另一个好处是能够共享NSUserDefaults数据库。这也适用于App Extensions(通知中心小部件,自定义键盘等)。

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

目标-C:

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

夫特:

NSUserDefaults(suiteName: "<group identifier>")

请记住,每个应用程序的[NSUserDefaults standardUserDefaults]数据库中的所有内容都不会转移到此数据库中。

documentation也给出了一个正确的例子(截至Beta 3)。

不要忘记同步数据库:

[yourDefaults synchronize];

答案 1 :(得分:69)

在多个应用之间共享NSUserDefaults数据

要在应用和分机之间或2个应用之间共享默认值,您必须使用以下步骤在设置中添加应用组:

  1. 在Project Navigator中,单击* .xcodeproj文件(应位于顶部)。
  2. 在Project Navigator的右侧查找Project and Targets。在目标下点击您的主要目标(应该是目标下的第一件事)。
  3. 在顶部,单击“功能”选项卡。
  4. 在“应用程序组”部分中,单击右侧的开关以打开“应用程序组”。
  5. 点击+按钮,添加名为 group.com.company.myApp 的应用程序组。
  6. 转到其他应用中的相同位置,此组现在可供选择。为将要使用此共享数据的每个应用启用此组。
  7. 注意:如果您访问Apple Developer Portal(显示所有证书,标识符,设备和配置文件的Apple网站)并转到标识符&gt;应用程序组您应该看到这个新的应用程序组。

    存储数据:

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

答案 2 :(得分:36)

根据我对现有文档的解释,应用程序组主要针对扩展,更具体地说,针对小部件。窗口小部件是他们自己的应用程序包,与您的应用程序共存。由于它们是一个单独的应用程序,因此拥有自己的沙箱,因此您需要使用应用程序组来共享文件。

在一些标题grep'ing之后,我认为我找到了所需的API,但实际上是作为iOS 7的一部分放入的。

NSFileManager上有一个方法containerURLForSecurityApplicationGroupIdentifier:,您可以在其中传入为应用启用应用组时创建的标识符:

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

答案 3 :(得分:5)

我今天所涉及的一个重要陷阱如下:

在许多项目中,我看到了一个应用程序目标,并为该目标的每个配置设置了不同的包标识符。事情变得凌乱。开发人员的目的是为调试配置创建调试应用程序,为发布目标创建生产应用程序。

如果您这样做,两个应用将在设置时共享相同的NSUserDefaults

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

这会在很多地方引起问题:

  1. 想象一下,当向用户显示特殊的应用程序介绍屏幕时,您为某个键设置了YES。另一个应用程序现在也会显示YES并且不显示介绍。
  2. 是的,有些应用还会在其用户默认值中存储oAuth令牌。无论如何......根据实现,应用程序将识别出有令牌并开始使用错误的令牌检索数据。很有可能会因为奇怪的错误而失败。
  3. 此问题的解决方案通常是在默认密钥前加上当前配置。您可以通过为配置设置不同的捆绑标识符,在运行时轻松检测配置。然后只需从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
    

答案 4 :(得分:2)

存储

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

答案 5 :(得分:1)

App Group 允许您在来自同一开发团队(帐户)的不同进程(应用程序、扩展...)之间共享数据(用户默认值、文件、CoreData(管理模型图)、POSIX 锁)。它创建了一个 shared container whit id,它从 group. 开始,用于保存/缓存您可以访问思想 url 和 IPC 的数据

App Group 与 UserDefaults 一起使用

  1. 为所有目标(应用程序、扩展程序...)添加具有相同 ID 的 App Group 功能,您将从中获得访问权限 enter image description here

创建后,您可以在 Apple Developer 上查看它。证书、ID 和配置文件 -> 标识符 -> 所有组

enter image description here

  1. 从 Application1 写入
let defaults = UserDefaults(suiteName: "group.goforit")
defaults?.setValue("Hello World!", forKey: "key1")
  1. 从 Application2 读取
let defaults = UserDefaults(suiteName: "group.goforit")
let result = defaults?.value(forKey: "key1") //Hello World!

shared container 根位置单一网址。

let rootURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.goforit")

//file:///Users/alex/Library/Developer/CoreSimulator/Devices/1AF41817-FE2E-485A-A592-12C39C0B0141/data/Containers/Shared/AppGroup/DC14D43F-2C2C-4771-83BE-64A9F54BD2E1/