【问题标题】:WatchKit didReceiveApplicationContext not being calledWatchKit didReceiveApplicationContext 没有被调用
【发布时间】:2015-09-26 23:03:01
【问题描述】:

无法呼叫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/

没有NSLogcolorLabel 的设置发生。不知道我错过了什么。谢谢!

【问题讨论】:

  • 您可以发布发送方的代码吗?发送端是否有任何错误返回?
  • 发送方没有返回错误。如果您让我知道您需要它,我仍然可以发布代码,但是发送方都很好。如果是这样,请告诉我。谢谢!

标签: swift watchkit xcode7 watchos-2


【解决方案1】:

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

WCSession.defaultSession.applicationContextiOS设备上被缓冲,所以只传输到watch strong>(扩展)一次,如果它不改变。

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

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

NSError*    error = nil;
[WCSession.defaultSession updateApplicationContext:@{ @"yourKey"       : @"your content",
                                                      @"forceTransfer" : NSDate.date }
                                             error:&error];

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

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

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。就我而言,它有助于关闭两个模拟器,然后运行 ​​Watch 方案。这会在连接状态下再次打开两个模拟器。

    希望对你有帮助!

    【讨论】:

    • 有意思,我试试看!
    • 这是我的解决方案
    【解决方案3】:

    我将上面的代码复制到一个新的手表应用程序中,它工作正常。错误必须在发送方。您确定正在调用 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 _ {
    
        }
    }
    

    【讨论】:

    • 感谢您的详细回复,让我试试这个!
    【解决方案4】:

    对我来说,在进行一些测试/调试时,我尝试在 AppDelegate 中触发 updateApplicationContext。这导致 didReceiveApplicationContext 没有被调用。

    将此逻辑移到稍后的位置,例如 UIViewController 至少对我有用。

    【讨论】:

      【解决方案5】:

      检查会话以确保其 isPaired 和 watchAppInstalled 属性均为 YES。似乎在这些为 NO 时更新共享上下文是行不通的。

      我遇到了这个问题。当任一条件为“否”时,更新上下文。添加了 sessionWatchStateDidChange: 的实现,如果两个条件都是 YES,则更新上下文。它奏效了。

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

      【讨论】:

      • 谢谢@druest!这帮助我解决了这个问题。在手表 OS 4 看起来确实没有发送具有相同内容的消息。 UUID 或任何其他唯一字符串将修复它。再次非常感谢!
      【解决方案6】:

      就我而言,我使用以下代码发送我的应用程序上下文:

          do {
              try session.updateApplicationContext(applicationContext)
          } catch let error {
              throw error
          }  
      

      并且既没有调用didReceiveApplicationContext,也没有引发错误

      我的问题是applicationContext 包含一个自定义对象,而只允许使用属性列表项。
      奇怪的是没有抛出任何错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-25
        相关资源
        最近更新 更多