ios - WCSession.sendMessage works 50/50 -
lately, working on project related watch/iphone communication again. code works , doesn’t work kind of weird me because think code should either work or not. cannot 50/50. therefore, have no idea goes wrong.
setup wcsession on iphone:
class watchcommunicationcontroller: nsobject, wcsessiondelegate { var session : wcsession? override init(){ // super class init super.init() // if wcsession supported if wcsession.issupported() { // supported // default session session = wcsession.defaultsession() // set delegate session!.delegate = self // activate session session!.activatesession() } else { print("iphone not support wcsession") } } ... ... } similar wcsession setup on watch:
class phonecommunicationcontroller: nsobject, wcsessiondelegate { var session : wcsession? override init(){ // super class init super.init() // if wcsession supported if wcsession.issupported() { // supported // default session session = wcsession.defaultsession() // set delegate session!.delegate = self // activate session session!.activatesession() } else { print("watch not support wcsession") } } ... ... } send out message on watch:
func sendgesture(gesture : gkgesture){
// if wcsession reachable if session!.reachable { // reachable // create interactive message 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{ // not reachable print("wcsession not reachable") } }
related enum:
enum gkgesture: int { case push = 0, left, right, up, down } receive message on 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) invalid 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) } somehow can’t debug watch app on xcode, debug session won’t attach. don’t know why. therefore, debug one-sided iphone.
sometimes got "receives gesture” print out, , not. , same getting notification.
i don't know if int wrapped around nsnumber while being transfer within wcsession. if be, must why when use int base class of enum won't work , works when string base class.
connectivity known issue app may crash when using nsnumber , nsdate objects wcsession api.
workaround: convert nsnumber or nsdate object string before calling wcsession apis. opposite conversion on receiving side.
Comments
Post a Comment