从 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,然后通过NSNotification
或Delegation
共享更改。
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 应用程序之间发送消息?