2015-01-23 8 views
6

में ओपनपेरेंट एप्लिकेशन का जवाब नहीं दे रहा है। मैं अपने वॉचकिट ऐप से अपने मुख्य मूल एप्लिकेशन पर जानकारी भेजने की कोशिश कर रहा हूं और जो मुझे समझ में आता है, मुझे अपने वॉचकिट एक्सटेंशन में openParentApplication का उपयोग करने में सक्षम होना चाहिए जो कि होगा AppDelegate.swift में handleWatchKitExtensionRequest द्वारा प्राप्त किया गया, लेकिन मुझे ट्रिगर होने के लिए handleWatchKitExtensionRequest प्राप्त नहीं हो रहा है।handleWatchKitExtensionRequest वॉचकिट एक्सटेंशन (स्विफ्ट)

मुझे कुछ समस्याएं आ रही हैं, इसलिए इस बिंदु पर मैं वास्तव में किसी भी जानकारी को वास्तव में पारित करने के बारे में चिंता करने से पहले किसी भी कनेक्शन को स्थापित करने की कोशिश कर रहा हूं।

let testDict = [ 
    "value1" : "Test 1", 
    "value2" : "Test 2" 
] 

@IBAction func saveButtonFunction() { 
    openParentAppForBalance(testDict) 
} 

private func openParentAppForInfo(Dict: [String: String]) { 

    WKInterfaceController.openParentApplication(testDict, 
     reply: {(reply, error) -> Void in 
      println("openParentApplication called in button function") 
    }) 
} 

जो उत्पादन में पता चलता है कि समारोह बुलाया जा रहा है, लेकिन handleWatchKitExtensionRequest सिर्फ अभ्यस्त जवाब: तो वर्तमान में मेरे Watchkit ViewController में मैं निम्नलिखित है। वर्तमान में यह AppDelegate.swift में जिसके बाद कहा जाता हो जाता है कभी नहीं करने के लिए सेट है:

func application(application: UIApplication!, handleWatchKitExtensionRequest userInfo: [NSObject : AnyObject]!, reply: (([NSObject : AnyObject]!) -> Void)!) { 

    println("we made it!") 

    var retValues = Dictionary<String,String>() 

    retValues["retval1"] = "return Test 1" 
    retValues["retval1"] = "return Test 2" 

    reply(retValues) 

} 

मुझे यकीन है कि मैं शायद सिर्फ यह कैसे काम करता है सब की मेरी समझ में वास्तव में कुछ यहां मौलिक याद कर रहा हूँ हूँ, लेकिन सब पर किसी भी मदद ट्रिगर होने के लिए handleWatchKitExtensionRequest कैसे प्राप्त करें के बारे में अत्यधिक सराहना की जाएगी!

उत्तर

25

आह, मुझे लगता है कि यहां क्या हो रहा है यह है कि आपका कोड दोनों सही है, और ठीक उसी तरह काम कर रहा है, और जो आप यहां व्याख्या कर रहे हैं वह दो पूरी तरह से समझने योग्य मान्यताओं के ओवरलैप का परिणाम है, जो वास्तव में नहीं हैं सही और आप भटक गए हैं। तो अच्छी खबर यह है कि आपका कोड पहले ही काम कर रहा है।

आप कहते हैं,

... जो उत्पादन कि समारोह बुलाया जा रहा है में से पता चलता ...

कि द्वारा तुम्हारा मतलब हैं कि कंसोल में आप संदेश देख रहे हैं

अपने कोड के इस भाग को एक स्विफ्ट बंद है:, openParentApplication called in button function, तो यहाँ क्या हो रहा है

{(reply, error) -> Void in 
     println("openParentApplication called in button function") 
} 

जब आपका वॉचकिट एक्सटेंशन WKInterfaceController.openParentApplication पर कॉल करता है तो यह आपके मूल आईफोन ऐप को एक शब्दकोश (आपके testDict) पर जाता है, जो आईफोन एप्लिकेशन आपके लिए डेटा वापस करने के लिए उपयोग कर सकता है-डेटा प्रदान करने के लिए क्रमबद्ध किया गया है। यह आपके पास वापस आने वाले बंद होने पर भी वापस आ जाता है। यह आपके वॉचकिट एक्सटेंशन को कोड चलाने के लिए सक्षम बनाता है जिसे उसने स्वयं परिभाषित किया है, बाद में जब उत्तर प्राप्त हुआ है। आप testDict में लौटाए गए दोनों डेटा के इस बंद करने के उपयोग में शामिल हो सकते हैं और अन्य चर जो openParentApplication पर स्थानीय रूप से सुलभ थे। आपका वॉचकिट एक्सटेंशन स्वचालित रूप से बंद होने पर कोड को निष्पादित करता है जब इसे वापस प्राप्त किया जाता है।

तो जब आप openParentApplication called in button function देखते हैं, तो यह इंगित करता है कि उत्तर आईफोन एप्लिकेशन से प्राप्त हुआ है, और बंद कर दिया गया है।इसलिए, अपने WatchKit परीक्षण कोड वास्तव में println बयान बदलना चाहिए होने के लिए:

WKInterfaceController.openParentApplication(testDict, 
    reply: {(reply, error) -> Void in 
     println("Reply to openParentApplication received from iPhone app") 
    }) 

अब, कारण है कि आप काफी जाहिर कोड का एहसास नहीं था सही ढंग से क्रियान्वित करने में किया गया था क्योंकि आप उम्मीद कर रहे थे कंसोल में अस्वीकार कर दिया गया देखना कि इस कोड अपने iPhone एप्लिकेशन में मार डाला गया था:

println("we made it!") 

हालांकि, Xcode एक साथ दो प्रक्रियाओं के लिए संलग्न समर्थन नहीं करता। इसलिए, जब आप अपने वॉचकिट ऐप से जुड़े होते हैं, तो आपको अपने आईफोन ऐप के किसी भी लॉग संदेश नहीं दिखाई देंगे। आपका आईफोन ऐप भी ब्रेकपॉइंट्स का जवाब नहीं देगा जब यह संलग्न प्रक्रिया नहीं है। ये दोनों सच हैं कि यह पृष्ठभूमि में चल रहा है (openParentApplication द्वारा जागृत) या अग्रभूमि में चल रहा है (यदि आप वॉचकिट ऐप चलाने के बाद इसे मैन्युअल रूप से सिम्युलेटर में लॉन्च करते हैं। आप आईफोन ऐप गतिविधि के प्रभाव देख सकते हैं, लेकिन जब आप वॉचकिट ऐप से जुड़े होते हैं तो सीधे इसका निरीक्षण नहीं कर सकते हैं।

तो सबसे पहले, आपका कोड सही तरीके से काम कर रहा है। आप अपने टेस्ट कोड को पीछे ले जा सकते हैं! और जब यह प्रतिक्रिया दे रहा है तो आईफोन पक्ष में कामकाज की आत्मनिरीक्षण के संबंध में अपने वॉचकिट ऐप में, आंशिक समाधान है। सिम्युलेटर से वॉचकिट ऐप लॉन्च करें, और एक बार यह चलने के बाद, एक्सकोड में मेनू विकल्प डीबग> प्रक्रिया करने के लिए संलग्न करें ... और के तहत अपनी आईफोन ऐप प्रक्रिया का चयन करें लक्ष्य पर लक्ष्य पी। अब आप अपने आईफोन ऐप कंसोल संदेश देखेंगे और आपका आईफोन ऐप ब्रेकपॉइंट्स का जवाब देगा-लेकिन निश्चित रूप से आप इन्हें वॉचकिट एप साइड से नहीं देख पाएंगे। आप सिमुलेटर में दोनों ऐप्स के साथ बातचीत करने में सक्षम होना जारी रखते हैं, और निष्पादन के दौरान आप किससे जुड़े हुए हैं, इसके बीच आगे और पीछे स्वैप कर सकते हैं।

+0

इसके लिए आपको बहुत बहुत धन्यवाद! संभावित लक्ष्य के तहत मेरा आईफोन ऐप चुनना अभी भी मुझे आईफोन ऐप से आउटपुट दिखा रहा है (वास्तव में यह बिल्कुल कोई आउटपुट नहीं दिखाता है) लेकिन मैंने '' पास करके आंशिक समाधान के लिए आंशिक समाधान किया। वर्णन '' प्रत्येक आइटम के उत्तर में एक आइटम के रूप में वापस जिसे मैं दिखाना चाहता था और उन्हें वॉचकिट एक्सटेंशन आउटपुट में मुद्रित करना चाहता था। लेकिन सबकुछ अब पूरी तरह से काम कर रहा है - मदद के लिए धन्यवाद! – JDevine

+0

पृष्ठभूमि मोड का उपयोग करने के तरीके पर एक कोड उदाहरण के लिए, जो सुनिश्चित करता है कि मुख्य ऐप में अपना उत्तर भेजने का समय है, "वॉच ऐप से कॉलिंग पेरेंट एप्लिकेशन" का संदर्भ लें (http://stackoverflow.com/questions/30000274/calling -पैरेंट-एप्लिकेशन-से-वॉच-एप/30000323 # 30000323) – vomako

+3

एक महत्वपूर्ण बिंदु: एक्सकोड एक ही समय में कई प्रक्रियाओं को डिबग करने के लिए संलग्न कर सकता है: वॉच किट ऐप शुरू करने के बाद, आईफोन सिम्युलेटर में अपने मुख्य ऐप पर क्लिक करें आइकन (इसे शुरू करने के लिए) और फिर एक्सकोड पर वापस जाएं। 'डीबग' मेनू में मेनू बार में, 'प्रक्रिया से संलग्न करें' का चयन करें और अपना मुख्य ऐप चुनें। अब आप दोनों अपने वॉच किट एक्सटेंशन और अपने मुख्य ऐप को डिबग कर रहे हैं! –

15

बस एक तरफ नोट, आप वास्तव में एक्सकोड में एक साथ दो प्रक्रियाओं से जुड़ सकते हैं और यह वॉचकिट डीबगिंग के लिए बहुत उपयोगी है। एक्सकोड से अपना वॉचकिट एक्सटेंशन लक्ष्य बनाएं और चलाएं और यह सिम्युलेटर में चलना शुरू कर देगा। अब, सिम्युलेटर में, अपना आईओएस ऐप लॉन्च करें। उस दौड़ के साथ, डीबग-> प्रक्रिया में संलग्न करें -> [आपकी ऐप प्रक्रिया का नाम] पर जाएं। अब आप एक्सकोड में चल रहे दोनों प्रक्रियाओं को देखेंगे और आप दोनों में लॉग, डीबग इत्यादि ... में सक्षम होंगे।

+0

क्या ऐसा कोई मामला नहीं है जो एक प्रक्रिया को दूसरे से अलग करता है? यह मेरा अनुभव रहा है कि आप एक सत्र के दौरान प्रक्रियाओं के बीच स्वैप कर सकते हैं, लेकिन एक साथ लॉग बयान आदि नहीं देख सकते हैं। शायद मैंने कुछ याद किया है/हालिया परिवर्तन को याद किया है? –

+0

println ("डीबग") का उपयोग करते समय मैं मुख्य ऐप से लॉग नहीं देख सकता। मुख्य ऐप को एक्सकोड डीबग से जोड़ने के बाद आप लॉग कैसे देख सकते हैं? – Peacemoon

+0

मैं पुष्टि कर सकता हूं कि वास्तव में ऊपर वर्णित दो प्रक्रियाओं को डीबग करने से वास्तव में काम करता है और जब मैं "ओपनपेरेंट" निकालता हूं तो मैं अपने घड़ी किट एक्सटेंशन और साथी ऐप दोनों के माध्यम से कदम उठाने में सक्षम था। – ericWasTaken

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