最近,我又在做一个与手表/iPhone通讯相关的项目。但我的代码有时工作,有时不工作,这对我来说有点奇怪,因为我认为代码要么工作,要么不工作。不能是50/50。因此,我不知道哪里出了问题。
setup WCSession on iPhone:
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上:
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){
// 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")
}}
相关枚举:
enum GKGesture: Int {
case Push = 0, Left, Right, Up, Down
}在iPhone:上接收消息
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进行单边调试。
有时我得到了“接收手势”打印出来,有时没有。同样的,得到通知。
发布于 2015-08-17 22:15:51
我不知道Int是否会在NSNumber内部传输时被打包到WCSession中。如果是的话,那么这就是为什么当我使用Int作为枚举的基类时,它不能工作,并且在String是基类时工作。
当您的应用程序使用NSNumber和NSDate对象和WCSession API时,您的应用程序可能会崩溃。 解决办法:在调用NSNumber API之前,将NSDate或WCSession对象转换为字符串。在接收端进行相反的转换。
发布于 2015-07-08 15:38:25
我猜您对sendMessage的调用是在它失败的情况下返回一个错误,但是您还没有实现错误处理程序!!现在,当您开始运行时,只需打印错误就可以了,但是如果这是传送代码,您确实应该处理适当的错误:
// 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)")发布于 2016-01-21 09:46:00
您的流程是正确的,但困难在于理解如何调试:
调试手表:
小型Swift示例:
将字典从Watch发送到iOS应用程序:
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应用程序中发送一段重播:
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:
与调试表完全相反的
此外,@锐利巴加的回答也有一个重要的考虑。
https://stackoverflow.com/questions/31282834
复制相似问题