是什么导致这种情况发生? NSUserDefaults 无法在 watchkit 项目中的 IOS 和 Watch 之间共享数据

What is causing this to happen? NSUserDefaults couldn't share the data between the IOS and Watch in a watchkit Project

我可以从 IOS 获取数据,但请注意。如果我通过 watchkit 扩展保存数据,IOS 无法获取 data.So 太奇怪了。我已经添加了组并创建了配置文件。 以下是我的片段:

class InterfaceController: WKInterfaceController {

@IBOutlet var outputLabel: WKInterfaceLabel!
override func awake(withContext context: Any?) {
    super.awake(withContext: context)

    // Configure interface objects here.
}

override func willActivate() {
    // This method is called when watch view controller is about to be visible to user
    super.willActivate()
}

override func didDeactivate() {
    // This method is called when watch view controller is no longer visible
    super.didDeactivate()
}


// load the data from the IOS
@IBAction func loadData() {
    let userDefaults = UserDefaults.standard
    userDefaults.synchronize()
    let outputData = userDefaults.string(forKey: "share")
    self.outputLabel.setText(outputData)
}
}

class ViewController: UIViewController {

@IBOutlet weak var inputData: UITextField!
@IBOutlet weak var inputLabel: UILabel!
@IBOutlet weak var outputLabel: UILabel!

// input string into the fieldText and save them in Group by NSUserDefaults
@IBAction func saveData(_ sender: AnyObject) {
    let inputData1 = self.inputData.text
    self.inputLabel.text = inputData1
    let userDefaults = UserDefaults.standard
    userDefaults.setValue(inputData1, forKey: "share")

    userDefaults.synchronize()
    self.outputLabel.text = userDefaults.string(forKey: "share")

}
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
}

如果您想在设备之间创建共享 userdefaults,您需要使用以下命令:

得到

UserDefaults(suiteName: "GROUP NAME")!.object(forKey: "share")

设置

UserDefaults(suiteName: "GROUP NAME")!.set("Test", forKey: "share")

其中 GROUP NAME 是您在创建应用组时设置的组名。

即使应用扩展包嵌套在其包含应用的包中,运行 应用扩展和包含应用也无法直接访问彼此的容器。

要启用数据共享,请使用 Xcode 或开发者门户为包含的应用及其包含的应用扩展启用应用组。接下来,在门户中注册应用组并指定要在包含的应用中使用的应用组。

启用应用组后,应用扩展及其包含的应用都可以使用 NSUserDefaults API 共享对用户首选项的访问权限。要启用此共享,请使用 initWithSuiteName: 方法实例化一个新的 NSUserDefaults 对象,传入共享组的标识符

Objective C

// Create and share access to an NSUserDefaults object

NSUserDefaults * sharedDefaults = [[NSUserDefaults alloc] initWithSuiteName: @"com.example.domain.MyShareExtension"];

// Use the shared user defaults object to update the user's account

[sharedDefaults setObject:@"Your Value" forKey:@"Your Key"];

swift:

func saveUserDefaults() {

let sharedDefaults = NSUserDefaults(suiteName: "com.example.domain.MyShareExtension")
    sharedDefaults?.setObject("Your Value", forKey: "Your Key")
    sharedDefaults?.synchronize()

}