将消息发送给Apple Watch时,应用程序会崩溃



我在iOS应用中具有UIBUTTON操作(sendMessageToWatch),Apple Watch中的标签(messageLabel)具有。我想做的是能够点击iPhone中的按钮并在Apple Watch的标签中看到它。

由于某种原因,当我点击按钮时,应用程序崩溃而不会输出任何错误。

我缺少什么?

这是代码。

ios ViewController

import UIKit
import WatchConnectivity
class ViewController: UIViewController, WCSessionDelegate {
    
    var session: WCSession!
    override func viewDidLoad() {
        super.viewDidLoad()
        if WCSession.isSupported() {
            let session = WCSession.default()
            session.delegate = self
            session.activate()
        }
    }
    
    func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {}
    func sessionDidDeactivate(_ session: WCSession) { }
    func sessionDidBecomeInactive(_ session: WCSession) { }
    
    @IBAction func sendMessageToWatch(_ sender: Any) {
        //Send Message to Watch
        let messageToSend:Dictionary = ["messageFromPhone":"Hello Watch."]
        
        session.sendMessage(messageToSend, replyHandler: { replyMessage in
            // some replay
        }, errorHandler: {error in
            // catch any errors here
        })
    }
}

观看InterfaceController

import WatchKit
import Foundation
import WatchConnectivity
class InterfaceController: WKInterfaceController, WCSessionDelegate {
    
    var session: WCSession!
    @IBOutlet var messageLabel: WKInterfaceLabel!
    func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) {
        //handle received message
        let value = message["messageFromPhone"] as? String
        DispatchQueue.main.async {
            self.messageLabel.setText(value)
        }
    }
    
    override func awake(withContext context: Any?) {
        super.awake(withContext: context)
    }
    override func willActivate() {
        // This method is called when watch view controller is about to be visible to user
        super.willActivate()
        
        if (WCSession.isSupported()) {
            session = WCSession.default()
            session.delegate = self
            session.activate()
        }
    }
    override func didDeactivate() {
        // This method is called when watch view controller is no longer visible
        super.didDeactivate()
    }
    
    func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {}
}

您在查看diddload中声明另一个会话对象。只需删除它:

var session: WCSession!
override func viewDidLoad() {
    super.viewDidLoad()
    if WCSession.isSupported() {
        session = WCSession.default()
        session.delegate = self
        session.activate()
    }
}

最新更新