2010-02-19 13 views
6

मैं GKSession का उपयोग करके दो डिवाइस कनेक्ट करना चाहता हूं, एक सर्वर के रूप में शुरू करना और दूसरा क्लाइंट के रूप में। इस कॉन्फ़िगरेशन का उपयोग करके मैं GKPeerPickerController का उपयोग नहीं कर सकता।GameKit: GKSession मैनुअल

मैं दो उपकरणों को जोड़ने के लिए समस्याएं आ रही हैं:

  • केवल ब्लूटूथ का उपयोग करना: असंभव
  • वाईफाई का उपयोग करते हुए: कम से कम वहाँ उपकरणों के बीच कुछ डेटा विनिमय लेकिन कोई सफलतापूर्वक टूटने के हैं।

इंटरफ़ेस फ़ाइल में मैं

GKSessionDelegate 
GKSession *session; 

कार्यान्वयन में है, मैं इस कोड का उपयोग सर्वर प्रारंभ:

session = [[GKSession alloc] initWithSessionID:@"iFood" displayName:nil sessionMode:GKSessionModeClient]; 
session.delegate = self; 
session.available = YES; 

ग्राहक इस कोड का उपयोग शुरू होता है:

session = [[GKSession alloc] initWithSessionID:@"iFood" displayName:nil sessionMode:GKSessionModeServer]; 
session.delegate = self; 
session.available = YES; 

मैं टी के बजाय ब्लूटूथ के उपयोग को कैसे मजबूर कर सकता हूं वह वाईफाई?

इसके अलावा, मैं लागू कर दिया है उन कॉल:

-(void)session:(GKSession *)session didReceiveConnectionRequestFromPeer:(NSString *)peerID { 
NSLog(@"Someone is trying to connect"); 
} 

- (BOOL)acceptConnectionFromPeer:(NSString *)peerID error:(NSError **)error { 
NSLog(@"acceptConnectionFromPeer"); 
} 

जब मैं शुरू, मैं इस डीबगर में मिलती है:

Listening on port 50775 
2010-02-19 14:55:02.547 iFood[3009:5103] handleEvents started (2) 

और जब अन्य उपकरण लगाने के लिए शुरू होता है, मैं इस मिल:

~ DNSServiceBrowse callback: Ref=187f70, Flags=2, IFIndex=2 (name=[en0]), ErrorType=0 name=00eGs1R1A..Only by Audi regtype=_2c3mugr67ej6j7._udp. domain=local. 
~ DNSServiceQueryRecord callback: Ref=17bd40, Flags=2, IFIndex=2 (name=[en0]), ErrorType=0 fullname=00eGs1R1A\.\.Only\032by\032Audi._2c3mugr67ej6j7._udp.local. rrtype=16 rrclass=1 rdlen=18 ttl=4500 
** peer 1527211048: oldbusy=0, newbusy=0 
~ DNSServiceBrowse callback: Ref=187f70, Flags=2, IFIndex=-3 (name=[]), ErrorType=0 name=00eGs1R1A..Only by Audi regtype=_2c3mugr67ej6j7._udp. domain=local. 
GKPeer[186960] 1527211048 service count old=1 new=2 
~ DNSServiceQueryRecord callback: Ref=17bd40, Flags=2, IFIndex=-3 (name=[]), ErrorType=0 fullname=00egs1r1a\.\.only\032by\032audi._2c3mugr67ej6j7._udp.local. rrtype=16 rrclass=1 rdlen=18 ttl=7200 
** peer 1527211048: oldbusy=0, newbusy=0 
~ DNSServiceBrowse callback: Ref=187f70, Flags=2, IFIndex=-3 (name=[]), ErrorType=0 name=00TF5kc1A..Only by Audi regtype=_2c3mugr67ej6j7._udp. domain=local. 
~ DNSServiceQueryRecord callback: Ref=188320, Flags=2, IFIndex=-3 (name=[]), ErrorType=0 fullname=00tf5kc1a\.\.only\032by\032audi._2c3mugr67ej6j7._udp.local. rrtype=16 rrclass=1 rdlen=18 ttl=7200 
** peer 1723356125: oldbusy=0, newbusy=0 
~ DNSServiceQueryRecord callback: Ref=188320, Flags=2, IFIndex=2 (name=[en0]), ErrorType=0 fullname=00TF5kc1A\.\.Only\032by\032Audi._2c3mugr67ej6j7._udp.local. rrtype=16 rrclass=1 rdlen=18 ttl=4500 
** peer 1723356125: oldbusy=0, newbusy=0 

मैं यहां क्या खो रहा हूं?

मुझे यकीन है कि दोनों डिवाइसों में ब्लूटूथ सक्षम है और एक ही वाईफाई में जुड़ा हुआ है।

धन्यवाद,

आर।

+1

एफवाईआई, आपका GKSessionModeClient और GKSessionModeServer बदल दिया गया है। – Jeff

उत्तर

-1

मैं इसी तरह की समस्याओं की थी, लेकिन वर्णन से ऊपर मुझे लगता है कि आप कुछ त्रुटियों कर रहे हैं:

GKSession केवल लागू करता है बीटी; यदि आप पिकर का उपयोग करते हैं, तो आप वाईफाई कनेक्शन से निपटने के लिए अलग-अलग तरीकों को प्रदान कर सकते हैं।

"didReceiveConnectionRequestFromPeer" विधि चाहिए कॉल सत्र वस्तु पर "acceptConnectionFromPeer" विधि - आप आपका प्रतिनिधि पर "acceptConnectionFromPeer" को लागू नहीं है।

डिबगिंग के लिए, आप प्रतिनिधि विधि में स्थिति परिवर्तन लॉग इन करना चाहिए "सत्र: सहकर्मी: didChangeState:" (http://developer.apple.com/iPhone/library/documentation/GameKit/Reference/GKSessionDelegate_Protocol/Reference/Reference.html देखें)। जब एक सहकर्मी "उपलब्ध" होता है, तो आप "कनेक्ट टॉपर:" कॉल कर सकते हैं; जब "कनेक्ट" होता है, तो आप "sendData: toPeers:" का उपयोग कर सकते हैं।

आईओ के लिए कनेक्शन स्थापित करने के बाद, आप सत्र पर "setDataReceiveHandler: withContext:" विधि को कॉल करना चाहते हैं।

इससे पहले मेरे कोड में कुछ टाइपो थे लेकिन अब यह काम कर रहा है।

शुभकामनाएं।

+0

हैलो, मेरे पास उन प्रतिनिधियों के तरीकों को लागू किया गया है, लेकिन मैंने उन्हें कोड में नहीं लिखा था। इसके अलावा मेरा सत्र: सहकर्मी: GChession का उपयोग करते समय didChangeState कभी कॉल नहीं करता है, लेकिन जब मैं पिकर का उपयोग करता हूं तो इसे कॉल किया जाता है। जब तक मैं क्या गलत हो सकता है या क्यों यह काम नहीं कर रहा है, मैं GKPicker ... धन्यवाद उपयोग कर रहा हूँ के बारे में अधिक जानकारी मिल गया है, कम से कम मैं जानता हूँ कि मैं केवल एक नहीं हूँ ... :-) संबंध, आर। – mongeta

+3

"जीकेएसशन केवल बीटी लागू करता है" ... यह सच नहीं है। – typeoneerror

+0

@type हालांकि यह सच है, मुझे विश्वास है कि इस जवाब को 'गेमकिट' दिया गया था, केवल ब्लूटूथ कनेक्शन के लिए समर्थन था और आपको वाईफाई पर डिवाइस कनेक्ट करने के लिए 'सीएफनेटवर्क' का उपयोग करना पड़ा। यह कहना अधिक सटीक होगा "यह अब सत्य नहीं है क्योंकि गेमकिट अब वाईफाई कनेक्शन का समर्थन करता है।" –

1

मुझे लगता है कि आप ग्राहक के साथ कनेक्शन स्वीकार करना याद करते हैं। आप "didReceiveConnectionRequestFromPeer" कॉलबैक प्राप्त करने के बाद आप इस तरह ग्राहक के साथ कनेक्शन स्वीकार करने की जरूरत है:

-(void)session:(GKSession *)session didReceiveConnectionRequestFromPeer:(NSString *)peerID { 
    NSLog(@"Someone is trying to connect"); 
    NSError *error; 
    [gkSession acceptConnectionFromPeer:peerID error:&error]; 
    if(error) 
    NSLog(@"Error on accept connection with peer: ", error); 
} 

इस के बाद आप "GKPeerStateConnected" यहाँ प्राप्त होगा:

- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state{} 

मैं इस मदद आप की उम्मीद है।

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