使 iOS 和 watchOS 应用程序可以访问 SwiftyUserDefaults 数组

Make SwiftyUserDefaults array accessible to iOS and watchOS app

我正在使用优秀的 SwiftyUserDefaults,它是 NSUserDefaults 和 Swift 的包装器,允许我的应用程序保留特定的数据数组,就像这样(删除了大量代码以只显示重要部分:

工作代码

 import SwiftyUserDefaults //The following is to show implementation in the parent iOS app. It works fine.
    class ViewController: UICollectionViewController { 

    var arrayToStore = DefaultsKey<NSArray>("arrayToStore")

    override func viewDidLoad() {
         Defaults[arrayToStore] = ["Element 1", "Element 2", "Element 3"]
        }
     func aFunctionThatNeedsToReadTheArray() {
         print([Defaults[arrayToStore]])
         }
    }

研究

以上工作正常,但我还希望此父应用程序的 watchKit watchOS 2 应用程序能够读取 arrayToStore。

我做了一些 research 并了解到 Apple 为此提供了一个解决方案,App Groups,它使 NSUserDefaults 中的内容和其他数据存储方式可以跨应用程序使用 - 在这种情况下,在parent iOS 应用及其配套的 watchOS watchKit 应用。编辑:感谢@PETAHCHRISTIAN,我了解到应用程序组不适用于 WATCHOS 2。那么,还有哪些其他方法?

编辑 2:知道 App Groups 不是解决方案,我做了更多的研究,并确定一个可能的解决方案是 WatchConnectivity 框架。这是正确的吗?如果是这样,我该如何使用它来允许手表应用程序访问 arrayToStore

问题

但是,我的问题是:如何使用 SwiftyUserDefaults 执行此操作?我希望能够在父应用程序中拥有 arrayToStore 数组,watchOS 2 应用程序可通过应用程序组读取(或其他方式,如果有更好的方法注意:感谢@PetahChristian,我了解到App Groups 不是这样做的方法。因此,我如何才能获得手表应用通过其他方式从父应用读取数组的预期结果?)。

我正在尝试的是:

  1. 通过在 iOS 应用和 watchKit 应用的 "Capabilities" 中启用应用组,打开应用组并选择应用组,如答案 here[=52 中所示=]
  2. 在 watchKit 应用程序的应用程序扩展中,使用 print([Defaults[arrayToStore]]),导致 "Use of unresolved identifier arrayToStore"。预期结果是打印 "Element 1"、"Element 2"、"Element 3"

使用WatchConnectivity

您可以从手表向 phone 发送请求,然后将某些内容发送回手表。我会将数组存储在单例中,然后使用 WatchConnectivity 的 sendMessage 函数。即使 iPhone 应用程序处于后台,此功能也有效。