在watchOS 2中阅读NSUserDefaults(我知道App Groups不起作用)

vic*_*lak 5 nsuserdefaults ios swift watchkit watchos-2

Apple文档说:"此外,iOS会自动将iOS应用程序首选项的只读副本转发给Apple Watch.您的WatchKit扩展程序可以使用NSUserDefaults对象读取这些首选项......".https://developer.apple.com/library/prerelease/watchos/documentation/General/Conceptual/WatchKitProgrammingGuide/SharingData.html#//apple_ref/doc/uid/TP40014969-CH29-SW1

但我无法读取我的WatchKit应用程序中保存在我的iPhone应用程序中的默认值,我做错了什么?

在WatchKit应用程序中,我甚至可以保存(仅限WatchKit)默认值,还是甚至不起作用?

iPhone Data:

let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject(dataArray, forKey: "DataSaved"
Run Code Online (Sandbox Code Playgroud)

观看ExtensionDelegate:

let defaults = NSUserDefaults.standardUserDefaults()
print(defaults.arrayForKey("DataSaved"))
print(defaults.objectForKey("DataSaved"))
Run Code Online (Sandbox Code Playgroud)

arrayForKeyobjectForKey用于打印nil.

我一定做错了什么,你知道它会是什么吗?

Sey*_*aei 10

之间的区别 NSUserDefaults

NSUserDefaults 是任何设备上的内存单位,因此它在iOS和watchOS以及tvOS等方面完全不同.

例如,如果您运行一个代码,NSUserDefaults在iOS上添加一个名为"key1"的新密钥(假设您正在使用NSUserDefaults.standardUserDefaults()),当您请求在watchOS上读取其数据时,它会为您提供一个空字典.

这是因为它的第一次,你存储字典只有在iOS应用中的目标,而不是在两个设备之间的共享空间.当WatchKit扩展想要使用时NSUserDefaults,它会读取保存在WatchKit Target中的(空)字典,而不是iOS Target中的(已填充)字典.

共享数据

在watchOS和iOS之间有一些共享词典的方法:

1-使用WatchConnectivitywatchOS 2中的框架,您可以在两个目标之间传递数据.您可以sendMessageWCSession类中使用或类似的函数来执行此操作.只是不要忘记添加WCSessionDelegate到您的InterfaceController(在watchOS中)或ViewController(在iOS中)类和应用程序代表,以便应用程序能够从中接收数据WatchConnectivity.

2-使用在线/云存储,你可以上传字典从iOS应用程序在那里,然后将其下载到watchOS应用.但是,这需要Internet连接,并且在许多情况下不适用,例如,如果您的应用程序不需要连接到Internet来执行其他任务,并且您强制用户仅为了同步而连接到Internet两个目标之间的简单字典.

3-使用应用程序组(如果您使用的是watchOS 1),我没有详细描述,因为它已经过时,您可能不希望仅为watchOS 1制作应用程序.

结论

1- NSUserDefaults分别在watchOS和iOS中返回两个不同的词典.

2-要在watchOS和iOS之间共享数据,您可以使用WatchConnectivityInternet(不推荐)和App Groups(在watchOS 1中).

更多资源

有关WatchConnectivity您问题的现代答案的更多详细信息,请查看Apple Developer Portal中的 Apple文档.

此外,你应该看到这个WWDC会议讨论watchOS 2中包含的这个伟大的框架.