swift - 我无法获得 WatchConnectivity 的 session :didRecieveMessage: to be called

标签 swift watchkit apple-watch

我已尝试让 WatchConnectivity 正常工作,但我无法将(位置)消息从我的 iPhone 发送到我的 Apple Watch。 在 AppDelegate 中,我设置了 session :

var session: WCSession!    

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.
    if WCSession.isSupported() {
        session = WCSession.defaultSession()
        session.delegate = self
        session.activateSession()
    }
    return true
}

在我的 ViewController 中:

let manager = CLLocationManager!

override func viewDidLoad() {
    super.viewDidLoad()
    manager.desiredAccuracy = kCLLocationAccuracyBest
    manager.startUpdatingLocation()
    self.manager.delegate = self
    // CLLocationManager status handling code
}

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { // I know this is called
    if let locationData = manager.location {
        let location = ["location" : locationData]
        (UIApplication.sharedApplication().delegate as! AppDelegate).session.sendMessage(locationData, replyHandler: nil, errorHandler: nil)
    }
}

这里是相关的接口(interface) Controller 代码:

var session: WCSession!

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.defaultSession()
        session.delegate = self
        session.activateSession()
    }
}


func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) { // This method is never called
    let location = message["location"] as? CLLocation
    print(location)
}

但是,我的 InterfaceController 没有收到消息,没有打印任何内容,也没有触发我设置的断点。

谁能指出我正确的方向?谢谢。

最佳答案

传递给sendMessage的字典内容只能包含属性列表类型(基本如数字、字符串、数据等)。我敢打赌,如果您添加了一个错误处理程序,您会收到一条错误消息,指示无法发送有效负载,因为它包含无效(非 plist)类型

此外,当您调用 sendMessage 时,如果您传入一个 nil replyHandler,则在接收方将调用与有 replyHandler 时不同的委托(delegate)方法。尝试实现另一个委托(delegate) didReceiveMessage 方法:

func session(session: WCSession, didReceiveMessage message: [String : AnyObject])

关于swift - 我无法获得 WatchConnectivity 的 session :didRecieveMessage: to be called,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32028392/

相关文章:

swift 3 迁移 : Generic parameter 'Element' could not be inferred

swift - 如何为 UILocalNotifiication 设置 NSDate

Xcode、Parse.com - 推送通知不显示在我的手机上。

swift - 静态通知和动态通知有什么区别?

ios - WatchOS 和位置权利

ios - watch 上未收到 WatchKit Darwin 通知

swift - 观看电话通信 - didReceiveApplicationContext 未触发

ios - 如何在突出显示按钮时获取事件而不是状态

ios - 删除 TableView 行会引发线程 1 : signal SIGABRT

swift - WatchOS:通过 "Next Page"segue 将数据从一个 Controller 传递到另一个 Controller