我正在尝试将 iPhone 应用程序中的字符串共享到 WatchKit 应用程序。我已为 iOS 应用程序和 WatchKit 扩展启用App Groups
。然后,在我的 iOS 应用程序中,我为 UserDefaults 设置了一个变量...
let defaults = UserDefaults(suiteName: "group.com.jacobcavin.appName")
然后在 ViewController
中,我将默认值设置为 TextField 文本中的字符串...
defaults?.set(textField.text!, forKey: "KEY")
在 iOS 应用程序内部,这工作得很好,我可以访问它并获得正确的值。但是,在 WatchKit 应用程序中,我尝试获取字符串...
let defaults = UserDefaults(suiteName: "group.com.jacobcavin.appName")
let string = defaults?.string(forKey: "KEY")
但是string
返回nil
。我浏览了大量教程,并确保每个目标都具有相同的组标识符、不同的 bundle 标识符,并且 entitlement.plist
文件是正确的。你能帮忙吗?
最佳答案
UserDefaults
应用组无法与 watch 应用扩展一起使用。您需要使用 WCSession
向 watch 发送 applicationContext
,然后在 watch 中将这些值设置为其 UserDefaults
。
例如,在 iPhone 上,您将激活 WCSession.default
并调用 try WCSession.default.updateApplicationContext(applicationContext)
,其中 applicationContext
是[字符串:任意]
。如果扩展程序位于前台,应用程序上下文将被发送到 watch ,或者将在下次启动应用程序时传递到扩展程序。
要响应 watch 应用程序扩展中的上下文,请激活默认 session ,将自己声明为委托(delegate)以接收新的应用程序上下文:
func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String : Any]) {
// handle receiving application context
DispatchQueue.main.async
{
// Save to UserDefaults or Update UI etc.
}
}
可以找到一个有点过时的示例 here 。流程还是一样,只是代码没有更新。
关于ios - 将字符串从 iPhone 发送到 WatchKit 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46799240/