es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

((Cualquier) lanzamiento -> Bool) lanza -> Opcional) no puede conformarse con ‘BinaryInteger’

Estoy enfrentando un problema al tratar de convertir el mensaje de la sesión de WC del Apple Watch en [String: Any], ya que estoy personalizando un proyecto de muestra que obtiene el ritmo cardíaco del Apple Watch y lo envía al iPhone. Espero poder obtener ayuda, ya que ya estoy luchando con la conectividad del reloj durante 3 días.

Veo que estoy recibiendo el mensaje correctamente del Apple Watch y estoy cerca de utilizar el mensaje recibido para actualizar el ritmo cardíaco en el lado de la aplicación de iOS. Pero creo que la declaración “guard let” está haciendo que la función didReceiveMessage se detenga a mitad de camino.

No estoy seguro, pero creo que si puedo “desenvolver” el mensaje [“rate”: 61] en 61 en formato doble, debería poder pasar la función guard let y hacer que esta función funcione.

Además, estoy viendo otro error que dice “NO con WCErrorCodeDeliveryFailed”, pero no estoy seguro por qué se está poblando esto ya que ya implementé soluciones sugeridas de otras respuestas SO. Pero creo que este error es redundante / no relacionado con el mensaje de error anterior.

Agradecería su ayuda.

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")
  }
}

Archivo Swift WatchKitConnection en la aplicación iOS

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema en esta situación radica en la declaración guard let. Como el mensaje recibido del Apple Watch es un diccionario con un par de clave-valor, el uso de message.values.first devolverá el valor del primer par de clave-valor en el diccionario, que en este caso sería 61. Sin embargo, la declaración guard let intenta extraer este valor como un String, lo cual no es correcto. En su lugar, debería extraerse directamente como un Double.

    Para solucionar esto, reemplazar la declaración guard let con el siguiente código:

    guard let heartRateDouble = message.values.first as? Double else {
        return
    }
    

    De esta manera, se extraerá correctamente la frecuencia cardíaca como un Double.

    En cuanto al error NO with WCErrorCodeDeliveryFailed, es posible que este sea un problema separado y requiera más investigación. Sin embargo, algunas soluciones comunes para este error incluyen asegurarse de que la sesión en el Apple Watch y el iPhone estén activados y sean accesibles, y verificar si hay algún error en la función didReceiveMessage que pueda estar causando que el envío del mensaje falle.

Comments are closed.