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

Reading NSUserDefaults in watchOS 2 (I know App Groups doesn't work)

Apple 文档说 "Also, iOS automatically forwards a read-only copy of your iOS app’s preferences to Apple Watch. Your WatchKit extension can read those preferences using an NSUserDefaults object..."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"))

arrayForKeyobjectForKey 打印 nil.

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

对不起。您无法读取 WatchKit 应用程序中的任何默认值,因为从 watchOS2 开始,它有自己的内存可供使用。所以你不能在 watchOS

中访问 iOS 的 NSUserDefaults 的值

您必须使用 WatchConnectivity 来共享 watch OS2 的数据。

需要说明的是,NSUserDefaults.standardUserDefaults() 会在手表和 phone 上调用时为您提供两个不同的词典。

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

Apple 文档:

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

之间的区别NSUserDefaults

NSUserDefaults是任何设备上的一个内存单元,所以在iOS和watchOS,以及tvOS等中是完全不同的

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

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

共享数据

有一些方法可以在 watchOS 和 iOS 之间共享字典:

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

接收数据

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

3- 使用应用程序组(如果您使用的是 watchOS 1),我没有对此进行更多描述,因为它已经过时并且您可能不希望只为 watchOS 1 制作应用程序。

结论

1- NSUserDefaults returns watchOS 和 iOS 中的两个不同词典。

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

更多资源

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

您还应该看到 this WWDC session 谈论 watchOS 2 中包含的这个伟大的框架。

Ns defaults.standard 是特定于该目标的,通过使用它,您可以访问该目标内的数据,在您的情况下,您需要访问另一个目标中的数据,所以听着,您需要做两件事,一件是 1.使用应用组 2. 不要使用用户 defaults.standard 使用 UserDefaults(suiteName:"group.yourgroup") 存储和访问数据 参考 this Link 可能会有用。