未调用 WatchKit didReceiveApplicationContext
WatchKit didReceiveApplicationContext not being called
我无法调用didReceiveApplicationContext
。有什么想法吗?
InterfaceController
:
import WatchKit
import Foundation
import WatchConnectivity
class InterfaceController: WKInterfaceController, WCSessionDelegate {
@IBOutlet var colorLabel: WKInterfaceLabel!
private let session: WCSession? = WCSession.isSupported() ? WCSession.defaultSession() : nil
override init() {
super.init()
session?.delegate = self
session?.activateSession()
}
override func awakeWithContext(context: AnyObject?) {
super.awakeWithContext(context)
}
func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]){
let colors : String = applicationContext["color"] as! String
colorLabel.setText(colors)
NSLog("session did receive application context")
}
}
我一直在关注本教程:http://www.kristinathai.com/watchos-2-how-to-communicate-between-devices-using-watch-connectivity/
没有 NSLog
或 colorLabel
的设置发生。不知道我错过了什么。谢谢!
我将上面的代码复制到一个新的手表应用程序中,它运行良好。错误必须出在发送端。您确定正在调用 iOS 应用程序中的代码吗?我假设您正在使用 Xcode 和两个模拟器,一个用于 iOS 应用程序,一个用于 WatchApp。
除非您在phone模拟器上打开应用程序,否则iOS端的代码不是运行。您在 iOS 方的何处以及如何发出 updateAppContext 调用?
在我的测试中,这是我在 iOS 端添加到我的 ViewController.swift 的所有内容(只有在我的 iOS 应用程序上启动此代码才会被触发=24=].)
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let session = WCSession.defaultSession()
session.delegate = self
session.activateSession()
do {
try session.updateApplicationContext( ["color" : "Red" ])
} catch _ {
}
}
我遇到了同样的问题。在我的例子中,它有助于关闭两个模拟器,然后 运行 Watch 方案。这将在连接状态下再次打开两个模拟器。
希望对您有所帮助!
对我来说,在做一些 testing/debugging 时,我试图在 AppDelegate
中触发 updateApplicationContext
。这导致 didReceiveApplicationContext
没有被调用。
把这个逻辑移到后面一点,比如 UIViewController
至少对我有用。
就我而言,我使用以下代码发送我的应用程序上下文:
do {
try session.updateApplicationContext(applicationContext)
} catch let error {
throw error
}
和都没有调用didReceiveApplicationContext
,也没有抛出错误。
我的问题是 applicationContext
包含一个自定义对象,而只允许 属性 个列表项。
奇怪的是没有报错
检查会话以确保其 isPaired 和 watchAppInstalled 属性均为 YES。似乎更新共享上下文而这些是 NO 是行不通的。
我遇到了这个问题。更改为 not 在任一条件为 NO 时更新上下文。添加了 sessionWatchStateDidChange: 的实现,如果两个条件都是 YES,则更新上下文。成功了。
我怀疑这与另一个问题相结合,如果数据没有不同,phone 将不会发送上下文导致 "never updating" 问题。传递 "uuid" 的解决方法确实有帮助,但我怀疑以上是更好的解决方法。
这似乎是一个典型的 'development phase' 问题!
WCSession.defaultSession.applicationContext 在 iOS 上 缓冲 设备,所以如果它没有改变,它只会被传输到 watch(扩展名)一次。
这导致了一个奇怪的发现,当 WCSession.defaultSession.updateApplicationContext[=32= 时,手表扩展 'didReveiveApplicationContext:' 似乎没有被调用] 再次在 iOS 应用程序中调用。 (尝试调用extension中的WSSession.defaultSession.receivedApplicationContext发现,其实早先传输的context是可用的)!
在测试情况中,将“changer”对象添加到上下文字典中非常有帮助(如 UUID 对象,或者 - 甚至更好 - NSDate.date)。这将确保上下文已更改(与缓冲的上下文相比)并再次传输(导致调用 didReceiveApplicationContext):-)
NSError* error = nil;
[WCSession.defaultSession updateApplicationContext:@{ @"yourKey" : @"your content",
@"forceTransfer" : NSDate.date }
error:&error];
并且:不要忘记在您的应用程序的生产版本中删除它,因为 - 当然 - 这会导致您的应用程序和手表扩展之间进行不必要的数据传输!
PS: checked answer通过创建一个新的应用程序解决了这个问题。并以这种方式刷新所有缓冲区...
我无法调用didReceiveApplicationContext
。有什么想法吗?
InterfaceController
:
import WatchKit
import Foundation
import WatchConnectivity
class InterfaceController: WKInterfaceController, WCSessionDelegate {
@IBOutlet var colorLabel: WKInterfaceLabel!
private let session: WCSession? = WCSession.isSupported() ? WCSession.defaultSession() : nil
override init() {
super.init()
session?.delegate = self
session?.activateSession()
}
override func awakeWithContext(context: AnyObject?) {
super.awakeWithContext(context)
}
func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]){
let colors : String = applicationContext["color"] as! String
colorLabel.setText(colors)
NSLog("session did receive application context")
}
}
我一直在关注本教程:http://www.kristinathai.com/watchos-2-how-to-communicate-between-devices-using-watch-connectivity/
没有 NSLog
或 colorLabel
的设置发生。不知道我错过了什么。谢谢!
我将上面的代码复制到一个新的手表应用程序中,它运行良好。错误必须出在发送端。您确定正在调用 iOS 应用程序中的代码吗?我假设您正在使用 Xcode 和两个模拟器,一个用于 iOS 应用程序,一个用于 WatchApp。
除非您在phone模拟器上打开应用程序,否则iOS端的代码不是运行。您在 iOS 方的何处以及如何发出 updateAppContext 调用?
在我的测试中,这是我在 iOS 端添加到我的 ViewController.swift 的所有内容(只有在我的 iOS 应用程序上启动此代码才会被触发=24=].)
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let session = WCSession.defaultSession()
session.delegate = self
session.activateSession()
do {
try session.updateApplicationContext( ["color" : "Red" ])
} catch _ {
}
}
我遇到了同样的问题。在我的例子中,它有助于关闭两个模拟器,然后 运行 Watch 方案。这将在连接状态下再次打开两个模拟器。
希望对您有所帮助!
对我来说,在做一些 testing/debugging 时,我试图在 AppDelegate
中触发 updateApplicationContext
。这导致 didReceiveApplicationContext
没有被调用。
把这个逻辑移到后面一点,比如 UIViewController
至少对我有用。
就我而言,我使用以下代码发送我的应用程序上下文:
do {
try session.updateApplicationContext(applicationContext)
} catch let error {
throw error
}
和都没有调用didReceiveApplicationContext
,也没有抛出错误。
我的问题是 applicationContext
包含一个自定义对象,而只允许 属性 个列表项。
奇怪的是没有报错
检查会话以确保其 isPaired 和 watchAppInstalled 属性均为 YES。似乎更新共享上下文而这些是 NO 是行不通的。
我遇到了这个问题。更改为 not 在任一条件为 NO 时更新上下文。添加了 sessionWatchStateDidChange: 的实现,如果两个条件都是 YES,则更新上下文。成功了。
我怀疑这与另一个问题相结合,如果数据没有不同,phone 将不会发送上下文导致 "never updating" 问题。传递 "uuid" 的解决方法确实有帮助,但我怀疑以上是更好的解决方法。
这似乎是一个典型的 'development phase' 问题!
WCSession.defaultSession.applicationContext 在 iOS 上 缓冲 设备,所以如果它没有改变,它只会被传输到 watch(扩展名)一次。
这导致了一个奇怪的发现,当 WCSession.defaultSession.updateApplicationContext[=32= 时,手表扩展 'didReveiveApplicationContext:' 似乎没有被调用] 再次在 iOS 应用程序中调用。 (尝试调用extension中的WSSession.defaultSession.receivedApplicationContext发现,其实早先传输的context是可用的)!
在测试情况中,将“changer”对象添加到上下文字典中非常有帮助(如 UUID 对象,或者 - 甚至更好 - NSDate.date)。这将确保上下文已更改(与缓冲的上下文相比)并再次传输(导致调用 didReceiveApplicationContext):-)
NSError* error = nil;
[WCSession.defaultSession updateApplicationContext:@{ @"yourKey" : @"your content",
@"forceTransfer" : NSDate.date }
error:&error];
并且:不要忘记在您的应用程序的生产版本中删除它,因为 - 当然 - 这会导致您的应用程序和手表扩展之间进行不必要的数据传输!
PS: checked answer通过创建一个新的应用程序解决了这个问题。并以这种方式刷新所有缓冲区...