WatchKit didReceiveApplicationContext没有被调用

SRM*_*RMR 2 swift watchkit xcode7 watchos-2

我不敢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")
    }

}
Run Code Online (Sandbox Code Playgroud)

我一直在跟随本教程:http : //www.kristinathai.com/watchos-2-how-to-communicate-between-devices-using-watch-connectivity/

否NSLog或colorLabel发生的情况。不知道我在想什么。谢谢!

Lab*_*Ars 5

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

该WCSession.defaultSession.applicationContext是缓冲上的iOS设备,所以它只是转移到表(扩展)一次,如果它不会改变。

这导致了一个奇怪的发现,即当再次在iOS应用中调用WCSession.defaultSession.updateApplicationContext时,似乎没有调用手表扩展' didReveiveApplicationContext: ' 。(尝试在扩展名中调用WSSession.defaultSession.receivedApplicationContext来查找实际上已提供了较早传输的上下文)!

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

NSError*    error = nil;
[WCSession.defaultSession updateApplicationContext:@{ @"yourKey"       : @"your content",
                                                      @"forceTransfer" : NSDate.date }
                                             error:&error];
Run Code Online (Sandbox Code Playgroud)

并且:不要忘了在应用的生产版本中删除它,因为-当然,这会导致应用与手表扩展之间不必要的数据传输!

PS:选中的答案通过创建新应用来解决此问题。然后以这种方式刷新所有缓冲区...


小智 2

我将上面的代码复制到一个新的手表应用程序中,它工作正常。错误必定出在发送方。您确定正在调用 iOS 应用程序中的代码吗?我假设您正在使用 Xcode 和两个模拟器,一个用于 iOS 应用程序,一个用于 WatchApp。

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

在我的测试中,这就是我在 iOS 端添加到 ViewController.swift 中的所有内容(直到我在 iPhone 上启动 iOS 应用程序后才会触发此代码。)

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 _ {

    }
}
Run Code Online (Sandbox Code Playgroud)