2010-02-20 28 views
11

मैं एक आईफोन ऐप पर काम कर रहा हूं जो पीयर-टू-पीयर कनेक्शन की अनुमति देगा। जो मैं समझता हूं उससे, मेरे पास जीकेपीयरपीकर या जीकेएसशन का उपयोग करने के बीच विकल्प है। मुझे पीयरपीकर का उपयोग करने का विचार पसंद नहीं है क्योंकि मैं एक कस्टम इंटरफेस दिखाना चाहता हूं, इसलिए मैंने जीकेएसशन के साथ जाने का फैसला किया, और हे, बोनस यह है कि यह वाई-फाई पर भी काम करता है, जबकि पीयर पिकर नहीं करता है।GKSession - अगर मेरे पास ब्लूटूथ और वाई-फाई बंद है तो क्या होगा?

ठीक है, तो समस्या है ... क्या होगा यदि उपयोगकर्ता के पास ब्लूटूथ और वाई-फाई दोनों बंद हैं? पीयर पिकर में, एप छोड़कर w/o पर ब्लूटूथ चालू करने का एक संकेत है। GKSession में यह नहीं है ... लेकिन एक दूसरे की प्रतीक्षा करें, ऐसा प्रतीत होता है कि मैं यह देखने के लिए भी जांच नहीं कर सकता कि ब्लूटूथ चालू है या नहीं!

Carpe Cocoa claims no problem, बस प्रतिनिधि की session:didFailWithError: विधि का उपयोग करें। लेकिन, जैसा कि यह टिप्पणियों में बताता है ... यह अब और काम नहीं कर रहा है! और मेरे अनुभव में, मैं सहमत हूं।

क्या ब्लूटूथ चालू होने पर प्रोग्रामेटिक रूप से जांचने का कोई और तरीका है? क्या ऐसा कुछ है जिसके लिए मुझे रीचैबिलिटी का लाभ उठाना चाहिए? या यह सिर्फ एक बग है कि ऐप्पल को अभी तक ठीक करना है? , मैं इस तरह मेरी सत्र बना रहा हूं

अधिक विशिष्ट होना करने के लिए:

GKSession *aSession = [[GKSession alloc] initWithSessionID:nil 
                displayName:user.displayName 
                sessionMode:GKSessionModePeer]; 

self.gkSession = aSession; 
[aSession release]; 

self.gkSession.delegate = self; 
self.gkSession.available = YES; 

[self.gkSession setDataReceiveHandler:self withContext:NULL]; 

वर्ग GKSessionDelegate लागू करता है, और मुझे पता है क्योंकि मैं जब ब्लूटूथ चालू है कि यह काम कर रहा है, प्रतिनिधि पद्धतियों को बुलाया जाता कोई बात नहीं। मैं उन्हें इस तरह के रूप में लागू किया गया है:

#pragma mark - 
#pragma mark GKSessionDelegate methods 

- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state { 
    if (GKPeerStateAvailable == state) { 
      [session connectToPeer:peerID withTimeout:10]; 
    } else if (GKPeerStateConnected == state) { 
      // gets user 

      NSError *error = nil; 
      [session sendData:user.connectionData 
         toPeers:[NSArray arrayWithObjects:peerID,nil] 
       withDataMode:GKSendDataReliable error:&error]; 
      if (error) 
       NSLog(@"%@",error); 
    } 
} 



- (void)session:(GKSession *)session didReceiveConnectionRequestFromPeer:(NSString *)peerID { 
    NSError *error = nil; 
    [session acceptConnectionFromPeer:peerID error:&error]; 
    if (error) 
      NSLog(@"%@",error); 
} 

- (void)session:(GKSession *)session connectionWithPeerFailed:(NSString *)peerID withError:(NSError *)error { 
    NSLog(@"%@",error); 
} 

- (void)session:(GKSession *)session didFailWithError:(NSError *)error { 
    NSLog(@"%@",error); 
} 

लॉग बयानों में से कोई भी मुद्रित कर रहे हैं और मैं एक विधि में breakpoints निर्धारित करते हैं, लेकिन उनमें से कोई मारा जाता है उपयोगकर्ता दोनों ब्लूटूथ और वाई-फाई बंद कर दिया है जब। मैं उम्मीद कर रहा था कि सत्र ट्रिगर करने के लिए कुछ होगा: didFailWithError: ताकि मैं उपयोगकर्ता को ब्लूटूथ चालू करने या वाई-फाई नेटवर्क से कनेक्ट करने के लिए प्रेरित कर सकूं।

+2

एक बग या संभवतः एक वृद्धि अनुरोध की तरह लगता है। आपको एक रडार दर्ज करना चाहिए। –

उत्तर

1

मैं मार्टिन गॉर्डन से सहमत हूं, लेकिन Apple's reachability का उपयोग करने के लिए एक कामकाज हो सकता है।

1

दिलचस्प बात, क्या आपने ब्लूटूथ ऑफ़ और वाईफाई ऑन के साथ इसका परीक्षण करने का प्रयास किया है? मुझे हाल ही में पता चला कि हालांकि मेरा प्रोग्राम इस 'ब्लूटूथ अनुपलब्ध' संदेश को बुला रहा था, लेकिन वास्तव में यह ब्लूटूथ एटी ऑल का उपयोग नहीं कर रहा था लेकिन मेरे वाईफाई नेटवर्क से कनेक्ट हो रहा था। मुझे ऐप्पल के पीयरपीकर ऑब्जेक्ट का उपयोग किये बिना ब्लूटूथ कनेक्शन में जीकेएसशन को मजबूर करने के तरीके के बारे में पता नहीं है, लेकिन पीयरपीकर ऑब्जेक्ट लोगों को अपने स्वयं के इंटरफेस बनाने की इजाजत देता है। ऐसा लगता है कि यह पीयर के अलावा कनेक्शन प्रकार नहीं है, इसलिए यदि आप क्लाइंट/सर्वर व्यवस्था चाहते हैं तो यह बहुत मदद नहीं करेगा।

-Ash

0

आप एप्पल के निजी एपीआई (मुझे लगता है कि BluetoothManger.h) का उपयोग करके, Blutooth प्रोग्राम के रूप में पर स्विच कर सकते हैं, लेकिन सावधान रहना, यह एप्पल App स्टोर धक्का में अस्वीकृति का कारण होगा।

-1

आपको उसी sessionID का उपयोग करना चाहिए।

+1

इसका क्या मतलब है? क्यूं कर? –

0

मैं ऐप्पल की पहुंच क्षमता का उपयोग करने की धारणा को दूसरा स्थान देता हूं। बोनस के रूप में यह ऐप्पल ऐप स्टोर सबमिशन दिशानिर्देशों में से एक के रूप में सूचीबद्ध है।

यह लागू करना मुश्किल नहीं है जितना आवश्यक कोड पहले से ही आपके लिए लिखा गया है।

एसएलएफ ने रीचैबिलिटी क्लास का उपयोग करके कुछ स्रोत कोड के लिए एक लिंक प्रदान किया, इसके अतिरिक्त यहां Apple Dev's official reachability example का एक लिंक है।

हालांकि, सुनिश्चित करें कि आप कनेक्टिबिलिटी को असीमित रूप से जांच रहे हैं।

मैं इसे अपने ऐप में उपयोग कर रहा हूं और हालांकि यह सबसे अच्छा समाधान नहीं है, कम से कम यह उपयोगकर्ता को सूचित करता है कि उसे कनेक्शन सेटिंग्स को समायोजित करने की आवश्यकता है या कोई नेटवर्क मौजूद नहीं है।

2

अब iOS 5 में, यह इतना की तरह प्राप्त किया जा सकता:

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:FALSE], CBCentralManagerScanOptionAllowDuplicatesKey, nil]; 
NSMutableArray * discoveredPeripherals = [NSMutableArray new]; 
CBCentralManager * manager = [[CBCentralManager alloc] initWithDelegate:self queue:nil]; 
[manager scanForPeripheralsWithServices:discoveredPeripherals options:options]; 
[manager stopScan]; 

यह जरूरी है कि आप iOS 5 में CoreBluetooth ढांचे आयात करते हैं तो ब्लूटूथ बंद है, प्रणाली है जो होगा एक चेतावनी दृश्य पॉप अप होगा ब्लूटूथ चालू करने के लिए पसंद की पेशकश करें। अन्यथा, यदि यह परिधीय पाता है तो यह एक संबंधित प्रतिनिधि विधि को कॉल करेगा, लेकिन अगर उस कार्यान्वयन में कुछ भी नहीं है तो आपको इसके बारे में चिंता करने की आवश्यकता नहीं है।

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