首页 文章

WatchKit_Extension.InterfaceController没有实现委托方法

提问于
浏览
2

我正在尝试使用一个简单的应用程序学习watchkit连接,并花了两天徒劳地研究这个错误:

_WatchKit_Extension.InterfaceController没有实现委托方法 .

我已经盲目地复制了"SimpleWatchConnectivity" https://developer.apple.com/library/content/samplecode/SimpleWatchConnectivity/Listings/SimpleWatchConnectivity_WatchKit_Extension_InterfaceController_swift.html演示代码中的代码 . 并且在没有成功的情况下搜索了论坛 .

我的代码构建并运行正常,但我在 Watch 上收到以下错误

2018-01-06 10:39:20.522995 1100 messageDemo WatchKit Extension [338:743006] [WC] - [WCSession onqueue_handleDictionaryMessageRequest:withPairingID:] _ block_invoke委托messageDemo_WatchKit_Extension.InterfaceController不实现委托方法2018-01-06 10:39: 20.524378 1100 messageDemo WatchKit扩展[338:743006] [WC] - [WCSession _onqueue_sendResponseError:identifier:dictionaryMessage:]标识符:A150D814-453C-44B7-B970-913697526D6A,带有WCErrorCodeDeliveryFailed

当我执行时:

if (WCSession.isSupported())  
    {  
        WCSession.default.delegate = self;  
        WCSession.default.activate()  

        if let messageText =  textField.text{  
             WCSession.default.sendMessage(["message": messageText]  
                ,replyHandler: {replyMessage in  
                    print(replyMessage)  
             }  

               , errorHandler: {error in  
                print( error.localizedDescription)}  )  
        }  
    }

来自iOS ViewController .

我的界面控制器如下:

import WatchKit

进口基金会
导入WatchConnectivity
class InterfaceController:WKInterfaceController
,WCSessionDelegate
{
func session(_ session:WCSession
,activationDidCompleteWith activationState:WCSessionActivationState
,错误:错误?){
打印("activationDidCompleteWith:(activationState )")/
}
func sessionReachabilityDidChange(_ session:WCSession){
/
/
打印("sessionReachabilityDidChange")
}

@IBOutlet var messageLabel: WKInterfaceLabel!  
override func awake(withContext context: Any?) {  
    super.awake(withContext: context)  

    /  
}  

override func willActivate() {  
    /  
    super.willActivate()  
    if (WCSession.isSupported())  
    {  
        WCSession.default.delegate = self;  
        WCSession.default.activate()  

    }  

}  

override func didDeactivate() {  

    super.didDeactivate()  

}  

private func session(session: WCSession, didReceiveMessage message: [String : Any]  
    , replyHandler: @escaping ([String : Any]) -> Void) {  
    self.messageLabel.setText(message["message"]! as? String)  
}  
   func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {  
    self.messageLabel.setText(message["message"]! as? String)  
}  
func session(_ session: WCSession, didReceiveMessageData messageData: Data) {  
    print("HERE01")  
}  

func session(_ session: WCSession, didReceiveMessageData messageData: Data, replyHandler: @escaping (Data) -> Void) {  
    self.session(session, didReceiveMessageData: messageData)  

     print("HERE02")  
}  
func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String : Any]) {  

     print("HERE03")  
}  

func session(_ session: WCSession, didReceiveUserInfo userInfo: [String : Any] = [:]) {  
     print("HERE04")  

}  
func session(_ session: WCSession, didFinish userInfoTransfer: WCSessionUserInfoTransfer, error: Error?) {  
    print("HERE05")  
}  

func session(_ session: WCSession, didReceive file: WCSessionFile) {  
    print("HERE06")  
    }  

func session(_ session: WCSession, didFinish fileTransfer: WCSessionFileTransfer, error: Error?) {  
    print("HERE07")  
}

}
(抱歉格式化,我尝试了10分钟才能把它弄好,但遗憾地失败了)

我添加了一堆打印件以确保涵盖所有案例 .

完整的错误是:

2018-01-06 10:39:20.522995 1100 messageDemo WatchKit Extension [338:743006] [WC] - [WCSession onqueue_handleDictionaryMessageRequest:withPairingID:] _ block_invoke委托messageDemo_WatchKit_Extension.InterfaceController不实现委托方法2018-01-06 10:39: 20.524378 1100 messageDemo WatchKit扩展[338:743006] [WC] - [WCSession _onqueue_sendResponseError:identifier:dictionaryMessage:]标识符:A150D814-453C-44B7-B970-913697526D6A,带有WCErrorCodeDeliveryFailed

任何帮助将不胜感激

[编辑]当我使用调试器监视电话应用程序时,我看到发送消息失败:

2018-01-07 09:47:23.319221 1100 messageDemo [6628:1549809] [WC] - [WCSession _onqueue_notifyOfMessageError:messageID:withErrorHandler:](null)errorHandler:YES with WCErrorCodeSessionNotActivated 2018-01-07 09:47:23.321103 1100 messageDemo [6628:1549978] [WC] - [WCSession _onqueue_notifyOfMessageError:messageID:withErrorHandler:] _ block_invoke drop for pairingIDs不再匹配 . pairingID(null),client pairingID :( null)尚未激活WatchConnectivity会话 .

当我尝试发送 second message 时,会生成从帖子顶部引用的watchKitExtension收到的错误 . first message 中watchKitExtension没有错误 .

2 回答

  • 1

    以下解决方案适用于通过 WCSession 在iPhone和iWatch之间共享数据,

    ViewController.swift

    import UIKit
    import WatchConnectivity
    
    class ViewController: UIViewController, WCSessionDelegate {
    
        @IBOutlet weak var textFieldMessage : UITextField!
        @IBOutlet weak var buttonSend : UIButton!
        var wcSession : WCSession!
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
    
            wcSession = WCSession.default
            wcSession.delegate = self
            wcSession.activate()
        }
    
        //MARK: - Button Actions
    
        @IBAction func clickSendMessage(_ sender : UIButton) {
    
            let message = ["message" : textFieldMessage.text!]
            do {
                try wcSession.updateApplicationContext(message)
            } catch {
                print("Something went wrong")
            }
        }
    
        // MARK: - WCSessionDelegate
    
        func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
            NSLog("%@", "activationDidCompleteWith activationState:\(activationState) error:\(String(describing: error))")
        }
    
        func sessionDidBecomeInactive(_ session: WCSession) {
            print("%@", "sessionDidBecomeInactive: \(session)")
        }
    
        func sessionDidDeactivate(_ session: WCSession) {
            print("%@", "sessionDidDeactivate: \(session)")
        }
    
        func sessionWatchStateDidChange(_ session: WCSession) {
            print("%@", "sessionWatchStateDidChange: \(session)")
        }
    }
    

    enter image description here

    InterfaceController.swift (观看延期)

    import WatchKit
    import Foundation
    import WatchConnectivity
    
    class InterfaceController: WKInterfaceController, WCSessionDelegate {
    
        var session : WCSession?
        @IBOutlet weak var sessionLabel : WKInterfaceLabel!
    
        override func willActivate() {
            // This method is called when watch view controller is about to be visible to user
            super.willActivate()
    
            session = WCSession.default
            session?.delegate = self
            session?.activate()
        }
    
        // MARK: - WCSessionDelegate
    
        func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
            NSLog("%@", "activationDidCompleteWith activationState:\(activationState) error:\(String(describing: error))")
        }
    
        func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String : Any]) {
            NSLog("didReceiveApplicationContext : %@", applicationContext)
            sessionLabel.setText(applicationContext["message"] as? String)
        }
    

    enter image description here

    OutPut will be as below,

    enter image description here

  • 5

    我的问题是sendMessage实现了replyHandler:{replyMessage in
    打印(replyMessage)
    我收到邮件时没有回复 . 我从来没有真正弄清楚如何发送回复,最后放弃了sendMessage,转而使用更准确地满足我要求的updateApplicationContext .

相关问题