首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WCSession.sendMessage工程50/50

WCSession.sendMessage工程50/50
EN

Stack Overflow用户
提问于 2015-07-08 03:04:20
回答 3查看 9.6K关注 0票数 11

最近,我又在做一个与手表/iPhone通讯相关的项目。但我的代码有时工作,有时不工作,这对我来说有点奇怪,因为我认为代码要么工作,要么不工作。不能是50/50。因此,我不知道哪里出了问题。

setup WCSession on iPhone:

代码语言:javascript
复制
class WatchCommunicationController: NSObject, WCSessionDelegate {

    var session : WCSession?

    override init(){

        //  super class init
        super.init()

        //  if WCSession is supported
        if WCSession.isSupported() {    //  it is supported

            //  get default session
            session = WCSession.defaultSession()

            //  set delegate
            session!.delegate = self

            //  activate session
            session!.activateSession()

        } else {

            print("iPhone does not support WCSession")
        }
    }

    ... ...
}

类似的WCSession安装在Watch上:

代码语言:javascript
复制
class PhoneCommunicationController: NSObject, WCSessionDelegate {

    var session : WCSession?

    override init(){

        //  super class init
        super.init()

        //  if WCSession is supported
        if WCSession.isSupported() {    //  it is supported

            //  get default session
            session = WCSession.defaultSession()

            //  set delegate
            session!.delegate = self

            //  activate session
            session!.activateSession()
        } else {

            print("Watch does not support WCSession")
        }
    }

    ... ...
}

在Watch上发送消息:

func sendGesture(手势: GKGesture){

代码语言:javascript
复制
//  if WCSession is reachable
if session!.reachable {     //  it is reachable

    //  create the interactive message with gesture
    let message : [String : AnyObject]
    message = [
                "Type":"Gesture",
                "Content":gesture.rawValue
              ]

    //  send message
    session!.sendMessage(message, replyHandler: nil, errorHandler: nil)
    print("Watch send gesture \(gesture)")

} else{                     //  it is not reachable

    print("WCSession is not reachable")
}

}

相关枚举:

代码语言:javascript
复制
enum GKGesture: Int {
    case Push = 0, Left, Right, Up, Down
}

在iPhone:上接收消息

代码语言:javascript
复制
func session(session: WCSession, didReceiveMessage message: [String : AnyObject]) {

        //retrieve info
        let type = message["Type"] as! String
        let content = message["Content"]

        switch type {

        case "Gesture":
            handleGesture(GKGesture(rawValue: content as! Int)!)
        default:
            print("Received message \(message) is invalid with type of \(type)")
        }

    }

    func handleGesture(gesture : GKGesture){

        print("iPhone receives gesture \(gesture)")

        var notificationName = ""

        switch gesture {

        case .Up:
            notificationName = "GestureUp"
        case .Down:
            notificationName = "GestureDown"
        case .Left:
            notificationName = "GestureLeft"
        case .Right:
            notificationName = "GestureRight"
        case .Push:
            notificationName = "GesturePush"
        }

        NSNotificationCenter.defaultCenter().postNotificationName(notificationName, object: nil)

    }

不知怎么的,我无法在Xcode上调试我的监视应用程序,调试会话就是不附加。我也不知道原因。因此,我只使用iPhone进行单边调试。

有时我得到了“接收手势”打印出来,有时没有。同样的,得到通知。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-08-17 22:15:51

我不知道Int是否会在NSNumber内部传输时被打包到WCSession中。如果是的话,那么这就是为什么当我使用Int作为枚举的基类时,它不能工作,并且在String是基类时工作。

当您的应用程序使用NSNumber和NSDate对象和WCSession API时,您的应用程序可能会崩溃。 解决办法:在调用NSNumber API之前,将NSDate或WCSession对象转换为字符串。在接收端进行相反的转换。

观看OS 2 Beta 4发布说明

票数 6
EN

Stack Overflow用户

发布于 2015-07-08 15:38:25

我猜您对sendMessage的调用是在它失败的情况下返回一个错误,但是您还没有实现错误处理程序!!现在,当您开始运行时,只需打印错误就可以了,但是如果这是传送代码,您确实应该处理适当的错误:

代码语言:javascript
复制
//  send message
session.sendMessage(message, replyHandler: nil, errorHandler: { (error) -> Void in
    print("Watch send gesture \(gesture) failed with error \(error)")
})
print("Watch send gesture \(gesture)")
票数 2
EN

Stack Overflow用户

发布于 2016-01-21 09:46:00

您的流程是正确的,但困难在于理解如何调试:

调试手表:

  1. 运行iPhone目标,完成后按下停止按钮。
  2. 打开模拟器内的iOS应用程序(从模拟器手动运行,而不是从Xcode),然后让它挂在那里。
  3. 切换到监视目标(yourAppName WatchKit App),放置相关的断点并运行它。
  4. iOS应用程序将自动放置在后台,然后您将能够使用sendMessage方法(在监视目标)发送所需的任何东西;如果您的iOS应用程序中有一个replayHandler,您甚至可以在监视目标(即InterfaceController)处接收sendMessage中的相关消息。

小型Swift示例:

将字典从Watch发送到iOS应用程序:

代码语言:javascript
复制
    if WCSession.defaultSession().reachable == true {
        let requestValues = ["Send" : "From iWatch to iPhone"]
        let session = WCSession.defaultSession()

        session.sendMessage(requestValues,
            replyHandler: { (replayDic: [String : AnyObject]) -> Void in
                print(replayDic["Send"])

            }, errorHandler: { (error: NSError) -> Void in
                print(error.description)
        })
    }
    else
    {
        print("WCSession isn't reachable from iWatch to iPhone")
    }

接收到来自手表的消息,并从iOS应用程序中发送一段重播:

代码语言:javascript
复制
    func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) {

      print(message.values)

      var replyValues = Dictionary<String, AnyObject>()

      replyValues["Send"] = "Received from iphone"
      // Using the block to send back a message to the Watch
      replyHandler(replyValues)
     }

Debug iPhone:

与调试表完全相反的

此外,@锐利巴加的回答也有一个重要的考虑。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31282834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档