我知道here列出的方法可以在Apple Watch和iOS上保存首选项。

但是,他们提到不能在Apple Watch端更改设置,并且需要WCSession才能从手表更改设置。

我正在寻找一种将偏好设置本地存储在手表上的方法。这些首选项仅适用于手表(因此,我不希望使用共享的首选项方案)。同样,该方法需要在有或没有手机的情况下都可以使用。

我的最终目标是,一旦用户在手表上更改了Apple Watch应用上的开关,它们便会保持其状态。如果应用程序关闭并重新打开,我希望保留它们的状态。

有关如何执行此操作的任何想法?到目前为止,我唯一的想法是将文件保存到手表本地,并在启动时从手表中读取文件,但我觉得必须有一种更简单的方法。

编辑:从那以后,我意识到,即使Apple不鼓励在手表上进行偏好设置,也完全有可能(可以像在iOS中那样完全使用UserDefaults)。这使我可以进行本地监视。然后,如果需要在手机和手表之间传输设置,则手表连接性(特别是TransferUserInfo)可以完成这项工作。

最佳答案

UserDefaults只是一个文件支持的字典。该文件存储为plist,而UserDefaults本质上是建立在PropertyListSerialization之上的。对于简单的设置,您可以滚动自己的默认值。手表上的文件存储与iOS中的基本相同:


  数据放置。 WatchKit扩展必须在管理数据中发挥积极作用。 WatchKit扩展的容器目录具有与iOS应用程序容器相同的基本结构。将用户数据和其他关键信息放在“文档”目录中。尽可能将文件放在Caches目录中,以便在可用磁盘空间不足时由系统删除它们。


let urls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)

guard let url = urls.first else {
    return
}

// The types that can be stored in this dictionary are the same as what NSUserDefaults can do
let preferences = [ "myDefault" : true ]

if let data = try? PropertyListSerialization.data(fromPropertyList: preferences, format: .xml, options: 1) {
    do {
        try data.write(to: url.appendingPathComponent("mypreferences.plist"))
    } catch {
        print("Failed to write")
    }
}

if let input = try? Data(contentsOf: url.appendingPathComponent("mypreferences.plist")),
    let dictionary = try? PropertyListSerialization.propertyList(from: input, options: .mutableContainersAndLeaves, format: nil),
    let d = dictionary as? [String : Bool],
    let value = d["myDefault"] {
        print(value)
}


或者

要共享首选项,可以使用解决方案here

07-26 09:40