设置包不适用于 watchOS 2

settings bundle not working on watchOS 2

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

根据Apple docs,这是可能的。 根据 this thread 上的某些人的说法,这是可能的。 this thread 上一位 Apple 员工表示,这是可能的。

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

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

请不要post回答有关如何使用 Watch Connectivity 执行此操作的问题。可以仅使用 watchOS 2 上的共享应用程序组来执行此操作,而无需观看 Connectivity,人们可以做到,这里直接从 docs:

In watchOS 2, your WatchKit extension may read the values of preferences, but you cannot write new values. Preferences in watchOS 2 are forwarded from iOS to Apple Watch, but any modifications you make are not sent back to iOS.

这是因为应用程序现在 运行 在 Apple Watch 上是原生的,这意味着它们无法从 iPhone 获取设置,因为设置不再存储在同一设备上.更多信息在这里:

我已经编辑了我的答案。之前,它谈到了无法使用应用程序组在 watchOS 2 中同步数据,但你的具体问题是关于设置包,它仍然从 iOS 同步到 watchOS 2 中的 Apple Watch。

我无法在模拟器中的 Xcode 7.1 / 7.2 中运行它,但它在真实设备上运行。 来自文档:

Preferences in watchOS 2 are forwarded from iOS to Apple Watch, but any modifications you make are not sent back to iOS. In watchOS 1, WatchKit extensions have direct access to the defaults database and may read and write values.

所有 3 个目标都应该配置相同的应用程序组(这里的 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)
}

最终结果:

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

使用 `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

另外,中提到的答案似乎让整个过程变得更加方便。