Swift UserDefault:通过共享组共享数据不起作用
Swift UserDefault :sharing data via share group doesn't work
最近刚开始使用 swifting,使用应用组在 iOS 台设备之间共享数据时遇到了问题。
基本上我已经按照以下步骤设置了项目:
[iPhone]
- 已为 iPhone 目标启用应用程序组
初始化数据如下(组ID与我在项目中设置的一致):
sharedDefaults = NSUserDefaults.init(suiteName: groupID)
sharedDefaults?.setObject("User Default Shared String", forKey: "test")
sharedDefaults?.synchronize()
通过在本地加载用户默认值再次检查测试字符串,能够在日志中显示。
let t_sharedDefaults = NSUserDefaults.init(suiteName: groupID);
t_sharedDefaults?.synchronize();
let str = t_sharedDefaults?.valueForKey("test") as! String;
print(str);
[观看扩展]
- 创建新的手表扩展目标。
- 启用应用程序组。
通过以下代码在上下文唤醒的情况下加载用户默认数据:
sharedDefaults = NSUserDefaults.init(suiteName: groupID);
sharedDefaults?.synchronize();
let str = sharedDefaults?.valueForKey("test")
print(str);
我先有 运行 iPhone 目标,然后是手表应用程序。
但是,手表应用无法从用户默认读取预期数据。
我也在Github上传了测试项目,如果你对这个问题有什么想法,请告诉我。
[Github]
https://github.com/mattcn/WatchOS_DataSharing
提前感谢您的帮助。
在 Watch OS1 中这行得通,但在 Watch OS2 中发生了一些变化。您需要使用一种叫做 WatchConnectivity 的东西来将您想要保存的数据发送到手表。
因此,即使您使用共享用户默认设置或应用组,您放入其中的数据也会在手表上,因此无法从 iOS 应用访问。
要向手表发送数据,您可以使用 WatchConnectivity 框架。
感谢 Ashish 提出 OS1 和 OS2 之间的区别。
刚刚从以下位置找到了一个很好的参考:
在 watchOS 2 中,您需要记住有 2 个不同的进程 运行:
Apple Watch 进程
iPhone 进程
这两个进程都有自己的沙箱,这就是他们称之为 "native" 的原因,因此,如果您尝试使用共享的 NSUserDefaults,它将无法工作,因为 Apple Watch 应用程序与主机具有完全不同的沙箱 iPhone应用
如果您想将 phone 中的内容保存到 Apple watch 目标上的 NSUserDefaults:
使用WatchConnectivity 将您要保存的数据发送到手表。然后手表收到你发给它的数据时,保存到Apple watch默认的NSUserDefaults.
最近刚开始使用 swifting,使用应用组在 iOS 台设备之间共享数据时遇到了问题。
基本上我已经按照以下步骤设置了项目:
[iPhone]
- 已为 iPhone 目标启用应用程序组
初始化数据如下(组ID与我在项目中设置的一致):
sharedDefaults = NSUserDefaults.init(suiteName: groupID) sharedDefaults?.setObject("User Default Shared String", forKey: "test") sharedDefaults?.synchronize()
通过在本地加载用户默认值再次检查测试字符串,能够在日志中显示。
let t_sharedDefaults = NSUserDefaults.init(suiteName: groupID); t_sharedDefaults?.synchronize(); let str = t_sharedDefaults?.valueForKey("test") as! String; print(str);
[观看扩展]
- 创建新的手表扩展目标。
- 启用应用程序组。
通过以下代码在上下文唤醒的情况下加载用户默认数据:
sharedDefaults = NSUserDefaults.init(suiteName: groupID); sharedDefaults?.synchronize(); let str = sharedDefaults?.valueForKey("test") print(str);
我先有 运行 iPhone 目标,然后是手表应用程序。 但是,手表应用无法从用户默认读取预期数据。
我也在Github上传了测试项目,如果你对这个问题有什么想法,请告诉我。
[Github]
https://github.com/mattcn/WatchOS_DataSharing
提前感谢您的帮助。
在 Watch OS1 中这行得通,但在 Watch OS2 中发生了一些变化。您需要使用一种叫做 WatchConnectivity 的东西来将您想要保存的数据发送到手表。 因此,即使您使用共享用户默认设置或应用组,您放入其中的数据也会在手表上,因此无法从 iOS 应用访问。
要向手表发送数据,您可以使用 WatchConnectivity 框架。
感谢 Ashish 提出 OS1 和 OS2 之间的区别。
刚刚从以下位置找到了一个很好的参考:
在 watchOS 2 中,您需要记住有 2 个不同的进程 运行:
Apple Watch 进程 iPhone 进程 这两个进程都有自己的沙箱,这就是他们称之为 "native" 的原因,因此,如果您尝试使用共享的 NSUserDefaults,它将无法工作,因为 Apple Watch 应用程序与主机具有完全不同的沙箱 iPhone应用
如果您想将 phone 中的内容保存到 Apple watch 目标上的 NSUserDefaults:
使用WatchConnectivity 将您要保存的数据发送到手表。然后手表收到你发给它的数据时,保存到Apple watch默认的NSUserDefaults.