8

这在 watchOS 1 上不是问题,但现在在 watchOS 2 上我无法读取手表扩展上的值。

根据Apple docs,这是可能的。根据该线程上的某些人的说法,这是可能的。根据此线程上的 Apple 员工的说法,这是可能的。

据我所知,我正在正确设置所有内容:

  • 我在 iOS 应用程序和具有相同标识符的手表扩展上启用了应用程序组。
  • 我将 Settings-Watch.bundle 添加到 iOS 应用程序并将ApplicationGroupContainerIdentifier具有相同标识符的添加到 plist

当我使用标识符作为套件名称初始化NSUserDefaults对象时,我无法读取手表扩展上的值。我可以在 iOS 应用程序上阅读它们。这发生在模拟器和真实设备中。

请不要发布有关如何使用 Watch Connectivity 执行此操作的答案。在没有 Watch Connectivity 的情况下,仅使用 watchOS 2 上的共享应用程序组就可以做到这一点,人们可以做到这一点,这里直接来自文档

在 watchOS 2 中,您的 WatchKit 扩展可以读取首选项的值,但您不能写入新值。watchOS 2 中的首选项会从 iOS 转发到 Apple Watch,但您所做的任何修改都不会发送回 iOS。

4

3 回答 3

8

我已经编辑了我的答案。之前,它谈到无法使用 App Groups 在 watchOS 2 中同步数据,但您的具体问题是关于 Settings Bundle,它仍然在 watchOS 2 中从 iOS 同步到 Apple Watch。

我无法让它在模拟器中的 Xcode 7.1 / 7.2 中工作,但它确实可以在真实设备上工作。从文档:

watchOS 2 中的首选项会从 iOS 转发到 Apple Watch,但您所做的任何修改都不会发送回 iOS。在 watchOS 1 中,WatchKit 扩展可以直接访问默认数据库并且可以读取和写入值。

所有 3 个目标都应配置相同的 App Group(此处的 Watch App 目标似乎是 OPs 问题中缺少的组件):

目标 应用组

我的设置包:

在此处输入图像描述 在此处输入图像描述

一些简单的界面代码InterfaceController.swift

@IBOutlet var label: WKInterfaceLabel!

@IBAction func buttonAction() {

    let sharedDefaults = NSUserDefaults.init(suiteName: "group.testSettings")
    let name_preference = String(sharedDefaults?.objectForKey("name_preference"))
    self.label.setText(name_preference)
}

和最终结果:

在此处输入图像描述 在此处输入图像描述

因此,它确实按预期工作,只是在模拟器中没有。似乎模拟器中的两个设备之间发生了一些隔离,试图准确了解那里发生的事情有点令人沮丧。

于 2015-09-22T03:07:32.443 回答
0

这是因为应用程序现在在 Apple Watch 上本地运行,这意味着它们无法从 iPhone 获取设置,因为设置不再存储在同一设备上。更多信息:无法从 watchOS 2 中的设置包中获取值

于 2015-09-21T20:31:49.750 回答
-1

使用 `WCSessions 处理的新过程可以在下面提到的文件中的示例 Apple 应用程序 - Lister 中看到。

https://developer.apple.com/library/ios/samplecode/Lister/Listings/Objective_C_ListerKit__WatchOS__AAPLConnectivityListsController_m.html#//apple_ref/doc/uid/TP40014701-Objective_C_ListerKit__WatchOS__AAPLConnectivityListsController_m-DontLinkElementID_57

此外,https: //stackoverflow.com/a/32628105/1640786 中提到的答案似乎使整个过程更加方便。

于 2015-09-23T23:39:02.437 回答