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

3

我正在使用优秀的SwiftyUserDefaults,它是一个用Swift封装的NSUserDefaults,使我的应用程序能够持久化某些数据数组,代码如下(为了显示重要部分而省略大量代码):

可用代码

 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。

我做了一些研究,发现Apple提供了一个解决方案App Groups,它使得NSUserDefaults和其他数据存储方式可以在应用之间共享 - 在这种情况下,共享iOS父应用程序和其伴随的watchOS watchKit应用程序之间的数组。编辑:我通过@PETAHCHRISTIAN学会了App Groups不能用于WatchOS 2。那么,还有哪些其他方法?

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

问题

然而,我的问题是:如何使用SwiftyUserDefaults实现这一点?我希望能够通过应用组(或其他方式,如果有更好的方法,请注意:感谢@PetahChristian,我已经知道App Groups不是这样做的方法。因此,我如何通过其他方式获得手表应用程序从父应用程序读取数组的期望结果?)使父应用程序中的一个数组arrayToStore可以被watchOS 2应用程序读取。

我的尝试:

  1. 通过在iOS应用程序和watchKit应用程序的“功能”中打开应用组并选择应用组来启用应用组,如此处所示。
  2. 在watchKit应用程序的应用程序扩展中使用print([Defaults[arrayToStore]]),结果是“未解决的标识符arrayToStore”。预期结果是打印“Element 1”,“Element 2”,“Element 3”。

在watchOS 2中不支持应用程序组。 - user4151918
@PetahChristian 谢谢!如果您发布一个不需要应用组的解决方案,我很乐意接受它! - rocket101
1个回答

2

使用WatchConnectivity

您可以从手表发送请求到手机,然后将返回的内容发送回手表。我建议将数组存储在单例中,然后使用WatchConnectivity的sendMessage函数。即使iPhone应用处于后台,该功能也可以正常工作。


感谢您的帮助!很抱歉,我仍在学习Swift,我不确定我知道如何实现您所建议的内容: 如果您能够在答案中添加一些代码以显示您的意思,那将是非常好的...并且感谢您的回答,我已经接受了它。 - rocket101
没问题,我从这个教程中学到了很多:http://www.raywenderlich.com/117329/watchos-2-tutorial-part-4-watch-connectivity
它非常棒,易于理解。我建议你也跟着这个教程走,因为它基本上解决了你所遇到的同样的问题。
- user2529173

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接