【发布时间】:2022-01-07 08:39:15
【问题描述】:
我在尝试从 Apple Watch 的 WC 会话 [String: Any] 转换消息时遇到问题,因为我正在自定义一个从 Apple Watch 检索心率并将其发送到 iPhone 的示例项目。我希望能得到一些帮助,因为我已经在手表连接上苦苦挣扎了 3 天。
我确实看到我从 Apple Watch 正确接收到消息,并且我即将利用收到的消息在 iOS 应用程序端更新心率。但我认为“guard let”语句导致 didReceiveMessage 函数中途停止。
我不确定,但我认为如果我可以将消息 ["rate": 61] 以双精度格式“解包”为 61,我应该能够通过 guard let 函数并使该函数正常工作。
除此之外,我看到另一个错误说“WCErrorCodeDeliveryFailed 否”,但我不确定为什么要填充这个错误,因为我已经从其他 SO 答案中实施了建议的解决方案。但我认为这个错误是多余的/与上述错误消息无关。
不胜感激。
import Foundation
import WatchConnectivity
protocol WatchKitConnectionDelegate: AnyObject {
func didFinishedActiveSession()
func updateLatestHeartRate(_ LatestHeartRate: Double)
}
protocol WatchKitConnectionProtocol {
func startSession()
func sendMessage(message: [String : AnyObject], replyHandler: (([String : AnyObject]) -> Void)?, errorHandler: ((NSError) -> Void)?)
}
class WatchKitConnection: NSObject {
static let shared = WatchKitConnection()
weak var delegate: WatchKitConnectionDelegate?
private override init() {
super.init()
}
func sendHeartRate(rate: Int) {
WCSession.default.sendMessage(["rate": rate], replyHandler: nil) { error in
print("Failed to send message: \(error)")
}
print("from iOS watchkit connection")
}
extension WatchKitConnection: WatchKitConnectionProtocol {
func startSession() {
session?.delegate = self
session?.activate()
}
func sendMessage(message: [String : AnyObject],
replyHandler: (([String : AnyObject]) -> Void)? = nil,
errorHandler: ((NSError) -> Void)? = nil)
{
validReachableSession?.sendMessage(message, replyHandler: { (result) in
print(result)
print("success in phone sendmessage function")
}, errorHandler: { (error) in
print("error in phone sendmessage function")
print(error)
})
}
}
extension WatchKitConnection: WCSessionDelegate {
func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {
print("didReceiveMessage from watch")
print(message)
delegate?.updateLatestHeartRate(Double(message.values.first))
guard let heartRate = message.values.first as? String? else {
return
}
guard let heartRateDouble = Double(heartRate!) else {
return
}
print("printing heartRate double from message\(heartRateDouble)")
delegate?.updateLatestHeartRate(heartRateDouble)
print("updateLatestHeartRate")
}
iOS 应用中的 WatchKitConnection Swift 文件
【问题讨论】:
-
是的,您需要安全地打开您的可选值。您尝试在下一行打开
message.values.first之前使用它。先解包,然后将其传递给您的委托方法。 -
另外,
message.value.first真的是String吗?还是Int?如果它是一个字符串,你会在其中有一个额外的?,例如,它应该是guard let heartRate = message.values.first as? String else { ... }(注意,不是String?)。 -
根据 print 语句假设它是
Int时要小心。但如果是整数,则为guard let heartRate = message.values.first as? Int else { ... }。 -
另外,我在那里看到了一个
!。你真的想避免做强制解包操作,好像它失败了,它会崩溃。但是如果你删除了那个无关的?,你就不需要强制解包了…… -
我很高兴您发布自己的答案。您将能够在一天左右的时间内接受它...
标签: ios swift watchos watchconnectivity