0

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

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

我错过了什么?

这是代码。

iOS 视图控制器

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

}

观察接口控制器

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?) {}
}
4

1 回答 1

1

您正在 viewDidLoad 中声明另一个会话对象,并用 let 重新声明它。只需将其删除:

var session: WCSession!
override func viewDidLoad() {
    super.viewDidLoad()
    if WCSession.isSupported() {
        session = WCSession.default()
        session.delegate = self
        session.activate()
    }
}
于 2016-12-11T02:41:25.233 回答