是什么导致这种情况发生? 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()
}
我可以从 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()
}