Swift WatchKit未收到未调用的应用程序上下文

Swift WatchKit未收到未调用的应用程序上下文,swift,watchkit,xcode7,watchos-2,Swift,Watchkit,Xcode7,Watchos 2,我无法获取要调用的didReceiveApplicationContext。有什么想法吗 接口控制器: import WatchKit import Foundation import WatchConnectivity class InterfaceController: WKInterfaceController, WCSessionDelegate { @IBOutlet var colorLabel: WKInterfaceLabel! private let se

无法获取要调用的
didReceiveApplicationContext
。有什么想法吗

接口控制器

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")
    }

}
我一直在遵循本教程的内容:


没有出现
NSLog
或设置
colorLabel
。不知道我错过了什么。谢谢

我将上述代码复制到一个新的watch应用程序中,它运行良好。错误必须发生在发送端。您确定正在调用iOS应用程序中的代码吗?我猜您正在使用Xcode和两个模拟器,一个用于iOS应用程序,一个用于WatchApp

除非您在手机模拟器上打开应用程序,否则不会运行iOS端的代码。在iOS端,您在哪里以及如何发出updateAppContext调用

在我的测试中,这是我在iOS端添加到我的ViewController.swift的全部内容(在我启动iPhone上的iOS应用程序之前,不会触发此代码)


我也有同样的问题。在我的例子中,关闭两个模拟器,然后运行监视方案是有帮助的。这将在连接状态下再次打开两个模拟器


希望有帮助

对我来说,在进行一些测试/调试时,我试图在
AppDelegate
中启动
updateApplicationContext
。这导致未调用
didReceiveApplicationContext


将此逻辑移动到以后的某个点,例如在
UIViewController中,它至少对我有效。

在我的情况下,我使用以下代码发送我的应用程序上下文:

    do {
        try session.updateApplicationContext(applicationContext)
    } catch let error {
        throw error
    }  
并且既没有调用
didReceiveApplicationContext
,也没有抛出错误

我的问题是
applicationContext
包含自定义对象,而只允许属性列表项。

奇怪的是没有抛出错误。

检查会话,确保其isPaired和watchAppInstalled属性都是YES。似乎在这些都不存在的情况下更新共享上下文是行不通的

我有这个问题。在任一条件为“否”时更改为不更新上下文。添加了sessionWatchStateDidChange:的实现,如果两个条件都为“是”,则更新上下文。成功了


我怀疑这与另一个问题相结合,即如果数据不不同,手机将不会发送上下文,这会导致“从不更新”问题。传递“uuid”的解决方法确实有所帮助,但我怀疑上面的方法是更好的解决方法

这似乎是一个典型的“开发阶段”问题

WCSession.defaultSession.applicationContextiOS设备上进行了缓冲处理,因此,如果它没有更改,则只将其传输到手表(分机)一次

这导致了一个奇怪的发现,当iOS应用程序中再次调用WCSession.defaultSession.updateApplicationContext时,似乎没有调用watch extensions“didReveiveApplicationContext:”。(尝试在扩展名中调用WSSession.defaultSession.receivedApplicationContext,以发现先前传输的上下文实际上是可用的)

测试情况下,将“changer”对象添加到上下文字典中非常有用(比如UUID对象,或者更好的是NSDate.date)。这将确保上下文已更改(与缓冲上下文相比)并再次传输(导致调用didReceiveApplicationContext):-)

还有:别忘了在应用程序的生产版本中删除它,因为-当然-这会导致应用程序和手表分机之间不必要的数据传输


PS:选中的答案通过创建一个新的应用程序解决了这个问题。并以这种方式刷新所有缓冲区…

您能为发送端发布代码吗?是否返回发送端的任何错误?没有返回发送端的错误。我仍然可以张贴代码,如果你让我知道你需要它,但发送端都是好的。如果有,请告诉我。谢谢谢谢你的详细回复,让我试试这个!有意思,我来试试看!这就是我对你的解决方案@druest!这帮助我解决了这个问题。在watch OS 4上,具有相同内容的消息看起来确实没有被发送。UUID或任何其他唯一字符串将修复它。再次非常感谢!
    do {
        try session.updateApplicationContext(applicationContext)
    } catch let error {
        throw error
    }  
NSError*    error = nil;
[WCSession.defaultSession updateApplicationContext:@{ @"yourKey"       : @"your content",
                                                      @"forceTransfer" : NSDate.date }
                                             error:&error];