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
objectForKey
和nil
。
我一定是做错了什么,你知道它会是什么吗?
答案 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:
答案 3 :(得分:0)
Ns defaults.standard特定于该目标,通过使用它,您可以访问该目标中的数据,在这种情况下,您需要访问另一个目标中的数据,因此侦听您需要做两件事: 1.使用应用程序组 2.不要使用用户默认值。标准使用UserDefaults(suiteName:“ group.yourgroup”) 存储和访问数据 请参阅this链接可能会有用。