我无法调用didReceiveApplicationContext
。有什么想法吗?
接口(interface) Controller
:
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
的设置发生。不知道我错过了什么。谢谢!
最佳答案
这似乎是一个典型的“开发阶段”问题!
WCSession.defaultSession.applicationContext 在 iOS 设备上被缓冲,所以它只传输到watch(扩展名)一次,如果它没有改变。
这导致奇怪的发现,当 WCSession.defaultSession.updateApplicationContext 在 iOS 应用程序中再次调用时, watch 扩展 'didReveiveApplicationContext:' 似乎没有被调用. (尝试在扩展中调用 WSSession.defaultSession.receivedApplicationContext 发现,之前传输的上下文实际上是可用的)!
在测试情况中,将“changer”对象添加到上下文字典中非常有帮助(例如 UUID 对象,或者 - 甚至更好 - NSDate 。日期)。这将确保上下文已更改(与缓冲的上下文相比)并再次传输(导致调用 didReceiveApplicationContext):-)
NSError* error = nil;
[WCSession.defaultSession updateApplicationContext:@{ @"yourKey" : @"your content",
@"forceTransfer" : NSDate.date }
error:&error];
并且:不要忘记在您的应用程序的生产版本中删除它,因为 - 当然 - 这会导致您的应用程序和 watch 扩展程序之间进行不必要的数据传输!
PS:选中的答案通过创建一个新应用解决了这个问题。并以这种方式刷新所有缓冲区...
关于swift - 未调用 WatchKit didReceiveApplicationContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32802894/