2016-02-02 10 views
6

तो मैं आईफोन से वॉच में एक सरणी का अनुरोध करने के लिए वॉच कनेक्टिविटी का उपयोग कर रहा हूं।त्रुटि: "संदेश उत्तर बहुत लंबा लगा" - WCSession घड़ी OS2

विचार घड़ी से sendMessage था, और आईफोन didReceiveMessage विधि के भीतर सरणी के साथ जवाब देगा।

हालांकि आईफोन प्रतिक्रिया नहीं दे रहा है, मैंने सोचा था कि जब मैं घड़ी से संदेश भेजता हूं तो आईफोन एप्लिकेशन खोल देगा। मैंने sendMessage पर एप्लिकेशन खोलने का भी प्रयास किया है लेकिन अभी भी कोई भाग्य नहीं है। जब मैं काफी देर तक प्रतीक्षा करता हूं तो मुझे निम्न त्रुटि संदेश मिलता है:

Error Domain=WCErrorDomain Code=7012 "Message reply took too long." UserInfo={NSLocalizedDescription=Message reply took too long., NSLocalizedFailureReason=Reply timeout occured.}

क्या कोई जानता है कि मैं कहां गलत हो रहा हूं?

एप्पल घड़ी

import WatchKit 
import Foundation 
import CoreData 
import WatchConnectivity 

class BookmarkedInterfaceController: WKInterfaceController, WCSessionDelegate { 

var session : WCSession! 
var objects: [AnyObject]! 

@IBOutlet var table: WKInterfaceTable! 

override func willActivate() { 
    super.willActivate() 
    //Check if session is supported and Activate 
    if (WCSession.isSupported()) { 
     session = WCSession.defaultSession() 
     session.delegate = self 
     session.activateSession() 
    } 
    sendMessageToIphone() 
} 
func sendMessageToIphone() { 
    if WCSession.defaultSession().reachable { 

     print("WCSession is reachabe") 

     let messageDict = ["Request": "iPhone Can You Give Me The Array"] 
     WCSession.defaultSession().sendMessage(messageDict, replyHandler: { (replyDict) -> Void in 
      print(replyDict) 
      }, errorHandler: { (error) -> Void in 
       print(error) 
     }) 
    } 
} 

func session(session: WCSession, didReceiveMessage message: [String : AnyObject]) { 
    //recieving message from iphone 
    print("recieved message from iphone \(message)") 

    objects.append(message["Array"]!) 

    print("Objects array = \(objects)")   
} 

कंसोल आउटपुट

WCSession is reachabe Array nil

iPhone App प्रतिनिधि iPhone से

import UIKit 
import CoreData 
import WatchConnectivity 

@UIApplicationMain 

class AppDelegate: UIResponder, UIApplicationDelegate, WCSessionDelegate { 

var window: UIWindow? 
var session : WCSession! 

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

    //Check if session is supported and Activate 
    if (WCSession.isSupported()) { 
     session = WCSession.defaultSession() 
     session.delegate = self 
     session.activateSession() 
    } 
} 

func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) { 

    print("did recieve message from Watch") 

    let applicationData = ["Array":["One", "Two", "Three"]] 

    replyHandler(applicationData) 

} 

कुछ भी नहीं मार डाला जा रहा है। यहां तक ​​कि जब मैं मैन्युअल रूप से ऐप खोलता हूं।

+0

आपका कोड मुझे ठीक लग रहा है। सिर्फ एक प्रश्न, आप एक ही डमी डेटा ('[" ऐरे ": [" वन "," टू "," थ्री "]] ') का उपयोग कर रहे हैं, है ना? क्योंकि यदि आपके पास वास्तविक डेटा वापस भेजने के लिए कुछ अन्य कोड ब्लॉक चल रहा है तो कुछ अन्य समस्या पूरी तरह से हो सकती है। जैसे कस्टम ऑब्जेक्ट्स की एक सरणी को इस तरह वॉच ऐप पर वापस नहीं भेजा जा सकता है। – Gandalf

+0

@ गैंडफ मैं पहले स्ट्रिंग्स की एक सरणी के साथ अभ्यास करने जा रहा था जिसे WCSession फ़ंक्शन के भीतर भेजा और मुद्रित किया गया था। मेरा उद्देश्य तालिका में प्रदर्शित करने के लिए एनएसएमएनेज्ड ऑब्जेक्ट की एक सरणी को घड़ी में भेजना था। तो मूल रूप से फोन पर उत्तर हैंडलर शब्द को देखने के लिए शब्दकोश के साथ और वस्तुओं की सरणी भेज देगा। वास्तव में अजीब बात यह है कि मैं फोन को जवाब देने के लिए कैसे प्राप्त नहीं कर सकता:/नई रिलीज के साथ एक्सकोड अपडेट कर सकता हूं और सर्वोत्तम – RileyDev

उत्तर

3

आप संदेश घड़ी का अनुरोध किया डेटा शामिल करने के लिए भेजा के जवाब चाहते हैं, तो आपको निम्न के लिए अपने कोड बदलना चाहिए:

घड़ी

func sendMessageToIphone() { 
    if WCSession.defaultSession().reachable { 

     print("WCSession is reachabe") 

     let messageDict = ["Request": "iPhone Can You Give Me The Array"] 
     WCSession.defaultSession().sendMessage(messageDict, replyHandler: { (replyDict) -> Void in 
      print("Array \(replyDict["array"])") 
      }, errorHandler: { (error) -> Void in 
       print(error) 
     }) 
    } 
} 

फोन

func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) { 

    print("did recieve message from Watch") 

    let applicationData = ["Array":["One", "Two", "Three"]] 

    //If identifier from recievedMessage is for Objects 

    replyHandler(applicationData) 

} 

और अलग-अलग, कारण से फोन से प्रेषण संदेश प्राप्त नहीं हुआ है क्योंकि आपने प्रेषण के लिए गलत प्रतिनिधि विधि लागू की है जिसका उपयोग आप कर रहे हैं।

यदि आप एक शून्य replyHandler तो इस प्रतिनिधि विधि प्राप्त पक्ष पर सक्रिय किया जाएगा साथ SendMessage कॉल: func session(session: WCSession, didReceiveMessage message: [String : AnyObject])

यदि आप एक गैर शून्य replyHandler साथ SendMessage कॉल तो इस प्रतिनिधि विधि हो जाएगा प्राप्त करने वाले पक्ष पर आह्वान किया गया: func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void)

+0

के लिए आशा करता हूं कि उत्तर देने के लिए धन्यवाद, इसलिए मैंने आपके द्वारा सुझाए गए कोड को बदल दिया, माफ करना, मुझे यकीन है कि आप इसके बारे में क्या कह रहे हैं आईफोन से घड़ी पर संदेश प्राप्त करना। क्या आप कह रहे हैं कि मुझे 'func session (session: WCSession, didReceiveMessage संदेश: [स्ट्रिंग: AnyObject]) बदलना चाहिए {प्रिंट ("iphone \ (message) से प्राप्त संदेश")}? साथ ही वह वर्तमान अपडेट के साथ मुझे कंसोल में निम्न आउटपुट मिलता है। 'WCSession पहुंच योग्य है ऐरे नील प्रोग्राम निकास कोड के साथ समाप्त हुआ: 0' – RileyDev

+0

अजीब; शायद 'प्रिंट ("ऐरे \ (उत्तरदायित्व [" सरणी "]) को बदलने का प्रयास करें")' प्रिंट '("उत्तरदायित्व \ (उत्तरदायित्व)") ' – ccjensen

0

आपको संदेश भेजने से पहले सत्र को सक्रिय करना होगा। आपको सत्र को सक्रिय करने से पहले प्रतिनिधि को सेट करना होगा क्योंकि आप कुछ लंबित संदेश खो सकते हैं।

iphone पक्ष:

import UIKit 
import WatchConnectivity 

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate, WCSessionDelegate { 

var window: UIWindow? 
var session : WCSession! 

func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) { 

    print("did recieve message from Watch") 
    let applicationData = ["Array":["One", "Two", "Three"]] 

    //If identifier from recievedMessage is for Objects 
    session.sendMessage(applicationData, replyHandler: { reply in 
     print("Got reply: \(reply)") 
     }, errorHandler: { error in 
      print("error: \(error)") 
    }) 
} 

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    session = WCSession.defaultSession() 
    session.delegate = self 
    session.activateSession() 
    return true 
} 
} 

iWatch विस्तार InterfaceController आप इंटरफेस नियंत्रक willactivate विधि में सत्र सक्रिय करना होगा।

import WatchKit 
import Foundation 
import WatchConnectivity 

class InterfaceController: WKInterfaceController, WCSessionDelegate { 

var session : WCSession! 
var objects: [AnyObject]! 

override func awakeWithContext(context: AnyObject?) { 
    super.awakeWithContext(context) 

    // Configure interface objects here. 
} 
override func willActivate() { 
    // This method is called when watch view controller is about to be visible to user 
    super.willActivate() 
    session = WCSession.defaultSession() 
    session.delegate = self 
    session.activateSession() 
    objects = [] 
    sendMessageToIphone() 
} 

override func didDeactivate() { 
    // This method is called when watch view controller is no longer visible 
    super.didDeactivate() 
} 

func sendMessageToIphone() { 
    if WCSession.defaultSession().reachable{ 

     print("WCSession is reachabe") 

     let messageDict = ["Request": "iPhone Can You Give Me The Array"] 
     WCSession.defaultSession().sendMessage(messageDict, replyHandler: { (replyDict) -> Void in 
      print(replyDict) 
      }, errorHandler: { (error) -> Void in 
       print(error) 
     }) 
    } 
} 

func session(session: WCSession, didReceiveMessage message: [String : AnyObject]) { 
    //recieving message from iphone 
    print("recieved message from iphone \(message)") 

    objects.append(message["Array"]!) 

    print("Objects array = \(objects)") 
} 
} 

नोट। पहले आईफोन एप्लिकेशन चलाएं। फिर एक्सटेंशन चलाएं और आईफोन ऐप को अग्रभूमि में रखें।

+0

क्षमा करें मैंने अपने प्रश्न को पूर्ण कोड से अपडेट किया है, मैंने पहले ही सक्रिय कर लिया है सत्र और प्रतिनिधि सेट करें। – RileyDev

+0

@JKSDEV वॉच साइड पर: आपने ऑब्जेक्ट सरणी प्रारंभ नहीं की है। इच्छा सक्रिय विधि में खाली सरणी वस्तुओं = [] बनाएँ। –

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