从 iPhone 向多个控制器的 Watch 发送和接收消息

Posted

技术标签:

【中文标题】从 iPhone 向多个控制器的 Watch 发送和接收消息【英文标题】:Send and receive messages from iPhone to Watch from multiple Controllers 【发布时间】:2016-12-31 17:56:02 【问题描述】:

处理从多个控制器发送和接收的通信的正确方法是什么?

我要做的是从 ios 的两个不同 viewController 向 WatchOS 中的两个不同 interfaceController 发送消息(分开,而不是同时)。

这是我所拥有的,它仅适用于 ViewController2 和 InterfaceController2 之间的通信,当消息从 ViewController1 发送到 InterfaceController1 时它会崩溃,因为它似乎一直针对来自 InterfaceController2 的 session 方法。

视图控制器 1:

class ViewController1: UIViewController,WCSessionDelegate
    var session: WCSession!
    override func viewDidLoad() 
      super.viewDidLoad()
        if WCSession.isSupported() 
          session = WCSession.default()
          session.delegate = self
          session.activate()
        
     

      func sendDataToWatch()
        let sendPrice:[String: Double] = ["price": 3.99]
        session.sendMessage(sendPrice, replyHandler:  replyMessage in
            // Some reply here, this could be nil
        , errorHandler: error in
            // Catch any errors here, this could be nil
            print("Error: \(error.localizedDescription)")
        )
     

InterfaceController 1:从 ViewController 1 接收消息

class InterfaceController1: WKInterfaceController, WCSessionDelegate
   var session: WCSession!

    override func awake(withContext context: Any?) 
        super.awake(withContext: context)

        if (WCSession.isSupported()) 
            session = WCSession.default()
            session.delegate = self
            session.activate()
        
    

   func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) 

    /// Capture data from ViewContorller 2
    let priceFromPhone = message["price"] as? String

    // do something with priceFromPhone
    

// ============================================

视图控制器 2:

class ViewController2: UIViewController,WCSessionDelegate
    var session: WCSession!
    override func viewDidLoad() 
      super.viewDidLoad()
        if WCSession.isSupported() 
          session = WCSession.default()
          session.delegate = self
          session.activate()
        
     

   func sendDataToWatch()
    let sendEngine:[String: Double] = ["engine": 2.5]
    session.sendMessage(sendEngine, replyHandler:  replyMessage in
        // Some reply here, this could be nil
    , errorHandler: error in
        // Catch any errors here, this could be nil
        print("Error: \(error.localizedDescription)")
    )
  

InterfaceController 2:从 ViewController 2 接收消息

class InterfaceController2: WKInterfaceController, WCSessionDelegate
   var session: WCSession!

    override func awake(withContext context: Any?) 
        super.awake(withContext: context)

        if (WCSession.isSupported()) 
            session = WCSession.default()
            session.delegate = self
            session.activate()
        
    

   func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) 

      /// Capture data from ViewContorller 2
      let engineFromPhone = message["engine"] as? String

      // do something with engineFromPhone
        
 

谢谢

【问题讨论】:

【参考方案1】:

我建议从处理您的 UI 的控制器中删除所有数据管理。这是一个糟糕的设计,以后像这样混合图层可能会让您头疼。

您应该有一个数据管理器,它是WCSession 委托,负责保存信息,然后通知相关方(视图控制器等)支持数据已更新。

【讨论】:

@ccjensen - 谢谢你的好建议。快速提问。我将从多个 iOS ViewController 向 WatchOS 中的多个 InterfaceController 发送信息,您是否建议在每个设备中创建一个数据模型,然后将这些模型用作每个设备中的中心通信? 是的,这对我来说听起来很明智。然后,任何一方的视图控制器都会让用户编辑数据,这些数据会与模型层通信,然后可能会有一个通信管理器订阅模型更改并决定将更改的内容、时间和方式传达给对方 我会试一试的。非常感谢。【参考方案2】:

根据我阅读的内容,我似乎需要将通信范围缩小到仅一个 ViewController 和一个 InterfaceController,然后通过NSNotificationDelegation 共享更改。

WatchConnectivity how to share session among multiple WKInterfaceControllers?

Using WCSession with more than one ViewController

【讨论】:

以上是关于从 iPhone 向多个控制器的 Watch 发送和接收消息的主要内容,如果未能解决你的问题,请参考以下文章

为啥通过 Apple Watch 向 iPhone 发送消息时 print() 不起作用?

在 SwiftUI 中使用 WCSession 向 Apple Watch 发送消息

如何在 iPhone 应用程序和 WatchKit 应用程序之间发送消息?

是否可以专门向 Apple Watch 发送本地通知?

如何从 Apple Watch 获取传感器数据到 iPhone?

将数据从 Apple Watch 发送到 iPhone