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

时间:2016-03-17 01:30:01

标签: ios swift nsuserdefaults watchkit watch-os-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"

观看ExtensionDelegate

let defaults = NSUserDefaults.standardUserDefaults()
print(defaults.arrayForKey("DataSaved"))
print(defaults.objectForKey("DataSaved"))
打印arrayForKey

objectForKeynil

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

4 个答案:

答案 0 :(得分:10)

NSUserDefaults

之间的差异

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

例如,如果您运行的代码会在iOS上向NSUserDefaults添加一个名为“key1”的新密钥(假设您使用的是NSUserDefaults.standardUserDefaults()),那么当您请求在watchOS上读取其数据时,它给你一个空字典。

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

分享数据

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

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

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

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

结论

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

2-要在watchOS和iOS之间共享数据,您可以使用NSUserDefaults,互联网(不推荐)和应用程序组(在watchOS 1中)。

更多资源

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

另外,你应该看到this WWDC session谈论watchOS 2中包含的这个伟大的框架。

答案 1 :(得分:3)

对不起。您无法读取WatchKit应用程序中的任何默认值,因为从watchOS2开始,它有自己的内存可供使用。因此,您无法从iOS中的NSUserDefaults访问watchOS

中的值

您必须使用WatchConnectivity共享监视OS2的数据。

答案 2 :(得分:2)

要明确的是,NSUserDefaults.standardUserDefaults()会在拨打手表和电话时为您提供两个不同的词典。

对于WatchConnectivity,请查看https://developer.apple.com/videos/play/wwdc2015/713/

Apple docs:

https://developer.apple.com/library/watchos/documentation/WatchConnectivity/Reference/WatchConnectivity_framework/index.html

答案 3 :(得分:0)

Ns defaults.standard特定于该目标,通过使用它,您可以访问该目标中的数据,在这种情况下,您需要访问另一个目标中的数据,因此侦听您需要做两件事: 1.使用应用程序组 2.不要使用用户默认值。标准使用UserDefaults(suiteName:“ group.yourgroup”) 存储和访问数据 请参阅this链接可能会有用。