Swift UserDefault:通过共享组共享数据不起作用

时间:2016-02-16 11:58:40

标签: swift nsuserdefaults watchkit ios-app-group

最近开始流动,并通过使用应用程序组在iOS设备之间共享数据而遇到问题。

基本上我已按照以下步骤设置项目:

[iPhone]

  • 启用iPhone目标的应用程序组
  • 下面的初始化数据(groupID与我在项目中设置的匹配):

    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);
    

[观看扩展名]

  • 制作新的观看扩展目标。
  • 启用App Group。
  • 通过以下代码在上下文中加载用户默认数据:

    sharedDefaults = NSUserDefaults.init(suiteName: groupID);
    sharedDefaults?.synchronize();
    let str = sharedDefaults?.valueForKey("test")
    print(str);
    

我首先运行iPhone目标,然后是手表应用程序。 但是,监视应用程序无法从用户默认值中读取预期数据。

我还在Github上传了测试项目,如果您对此问题有任何想法,请告诉我。

[Github上]

https://github.com/mattcn/WatchOS_DataSharing

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

在Watch OS1中,这有效,但在Watch OS2中有一些变化。您需要使用名为WatchConnectivity的内容将要保存的数据发送到手表。 因此,即使您使用共享用户默认设置或应用程序组,您放入其中的数据也将在手表上,因此无法从iOS应用程序访问。

要将数据发送到手表,您可以使用WatchConnectivity框架。

答案 1 :(得分:0)

感谢Ashish将OS1和OS2之间的差异化。

刚从以下方面找到了一个很好的参考: NSUserDefaults(suiteName:) on iOS 9 and WatchOS 2 - not working?

在watchOS 2中,您需要记住有2个不同的进程在运行:

Apple Watch Process iPhone流程 这两个进程都有自己的沙箱,这就是为什么他们称之为“本机”,所以如果你尝试使用共享的NSUserDefaults它将无法工作,因为Apple Watch应用程序的沙箱与主机iPhone应用程序完全不同。

如果您想将手机中的东西保存到Apple手表上的NSUserDefaults目标:

使用WatchConnectivity将要保存的数据发送到手表。然后当手表收到您发送给它的数据时,将其保存到Apple手表的默认NSUserDefaults。