本地设置如何存储在Apple手表上?

时间:2017-07-10 19:58:11

标签: swift nsuserdefaults apple-watch watch-os wkinterfaceswitch

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

但是,他们提到Apple Watch方面无法更改设置,并且需要WCSession来更改手表中的设置。

我正在寻找一种在手表上本地存储偏好的方法。这些偏好仅适用于手表(因此共享偏好方案不是我正在寻找的)。此外,该方法需要在有或没有电话的情况下工作。

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

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

编辑:我已经意识到即使Apple不鼓励在手表上设置首选项,也完全有可能(UserDefaults可以像在iOS中一样使用)。这让我可以进行本地手表设置。然后,如果需要在手机和手表之间传输设置,Watch Connectivity(特别是TransferUserInfo)可以完成这项工作。

1 个答案:

答案 0 :(得分:0)

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

  

数据展示位置。 WatchKit扩展必须在管理数据方面发挥积极作用。 WatchKit扩展的容器目录与iOS应用程序的容器具有相同的基本结构。将用户数据和其他关键信息放在Documents目录中。尽可能将文件放在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