2015-07-08 7 views
10

हाल ही में, मैं एक परियोजना पर काम कर रहा हूं, फिर से वॉच/आईफोन संचार से संबंधित है। लेकिन मेरा कोड कभी-कभी काम करता है और कभी-कभी काम नहीं करता है जो मेरे लिए अजीब तरह का है क्योंकि मुझे लगता है कि कोड या तो काम करना चाहिए या नहीं। यह 50/50 नहीं हो सकता है। इसलिए, मुझे नहीं पता कि क्या गलत हो जाता है। iPhone परWCSession.sendMessage काम करता है 50/50

सेटअप WCSession:

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") 
     } 
    } 

    ... ... 
} 

Watch पर समान WCSession स्थापना:

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 पर संदेश भेजने:

समारोह sendGesture (इशारा: जीकेजीस्टर) {

// 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:

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 पर मेरे Watch एप्लिकेशन डिबग नहीं कर सकते , डीबग सत्र बस नहीं होगा tach। मुझे नहीं पता क्यों। इसलिए, मैं सिर्फ आईफोन के साथ एक तरफा डीबग।

कभी कभी मैं "इशारा प्राप्त करता है" प्रिंट आउट, और कभी कभी नहीं। और अधिसूचना प्राप्त करने के लिए एक ही मिला है।

+0

क्या आपने "सामग्री और सेटिंग्स रीसेट करें" की कोशिश की है और अपनी घड़ी/आईफोन सिमुलेटर और एक्सकोड को पुनरारंभ किया है? यह आपके डीबग सत्र को संलग्न करने के लिए सुझाव है। मुझे बताएं कि यह कैसे जाता है और फिर मैं वॉच कनेक्ट कनेक्टिविटी के मुद्दों की कोशिश कर सकता हूं और आपकी मदद कर सकता हूं – Philip

+0

मैं अपने आईफोन और ऐप्पल वॉच के साथ डीबग करता हूं। –

+0

क्या आपको पहुंच के लिए कुछ खास करना पड़ा? मेरा कोड बहुत समान है, लेकिन पहुंचने की जांच करते समय मेरा चेक हमेशा 'झूठा' देता है – prawn

उत्तर

6

मुझे नहीं पता कि WCSession के भीतर स्थानांतरण के दौरान इंटेल एनएसएनंबर के आसपास लपेटा जाएगा या नहीं। अगर ऐसा होगा, तो यही कारण है कि मुर्गी मैं इंट का बेस क्लास के रूप में इंट का उपयोग करता हूं, यह काम नहीं करेगा और स्ट्रिंग बेस क्लास है जब काम करता है।

कनेक्टिविटी ज्ञात समस्या के कारण आपका ऐप जब NSNumber का उपयोग कर क्रैश हो सकता है और NSDate WCSession एपीआई के साथ वस्तुओं।

वर्कअराउंड: WCSession API को कॉल करने से पहले एक स्ट्रिंग पर एक NSNumber या NSDate ऑब्जेक्ट को कनवर्ट करें। पक्ष प्राप्त करने पर विपरीत रूपांतरण करें।

Watch OS 2 Beta 4 release note

2

मेरा अनुमान है 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)") 
+0

मैंने इंट टू स्ट्रिंग से अपना enum बदलकर इसे ठीक किया। और मैं हर समय काम करता हूं। क्या आप सोच सकते हैं क्यों? अधिक जानकारी: इस प्रेषण को ट्रिगर करने के लिए प्रत्येक बटन को मैं बटन पर दबाकर बदलता हूं, यह स्टेटस बार पर छोटी प्रगति इंडिकेटर दिखाता है। लेकिन परिवर्तन के बाद अब और नहीं। –

+0

नहीं, जो मुझे कोई समझ नहीं आता :) मुझे शायद वास्तविक कोड को देखने की आवश्यकता होगी और आपके लिए कोई और जवाब प्राप्त करने के लिए इसे चलाने में सक्षम होना चाहिए – ccjensen

1

आपका प्रवाह सही है लेकिन कठिनाई को समझने के लिए डिबग करने के लिए है:

डीबग घड़ी:

  1. भागो iPhone लक्ष्य और मारा जब यह किया जाता है स्टॉप बटन।
  2. सिम्युलेटर के अंदर आईओएस ऐप खोलें (इसे सिम्युलेटर से मैन्युअल रूप से चलाएं और एक्सकोड से नहीं) और इसे वहां लटका दें।
  3. वॉच लक्ष्य (yourAppName वॉचकिट ऐप) पर स्विच करें, प्रासंगिक ब्रेकपॉइंट डालें और इसे चलाएं।
  4. आईओएस ऐप पृष्ठभूमि में स्वचालित रूप से रखा जाएगा और फिर आप जो भी चाहते हैं उसे भेजने के लिए sendMessage विधि (वॉच लक्ष्य पर) का उपयोग करने में सक्षम होंगे और यदि आपके पास अपने आईओएस ऐप में रीप्ले हैंडलर है तो आप प्रासंगिक भी प्राप्त करेंगे अपनी दृश्य लक्ष्य पर SendMessage अंदर संदेशों (यानी InterfaceController)

छोटे स्विफ्ट उदाहरण:

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") 
    } 

से घड़ी संदेश प्राप्त कर रहे हैं और आईओएस app से पुनरावृत्ति भेजने:

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) 
    } 

डीबग iPhone:

डिबग के ठीक विपरीत घड़ी

इसके अलावा,

@ शार्पबागा का जवाब एक महत्वपूर्ण विचार है।

संबंधित मुद्दे