मैं एक आईफोन ऐप पर काम कर रहा हूं जो पीयर-टू-पीयर कनेक्शन की अनुमति देगा। जो मैं समझता हूं उससे, मेरे पास जीकेपीयरपीकर या जीकेएसशन का उपयोग करने के बीच विकल्प है। मुझे पीयरपीकर का उपयोग करने का विचार पसंद नहीं है क्योंकि मैं एक कस्टम इंटरफेस दिखाना चाहता हूं, इसलिए मैंने जीकेएसशन के साथ जाने का फैसला किया, और हे, बोनस यह है कि यह वाई-फाई पर भी काम करता है, जबकि पीयर पिकर नहीं करता है।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: ताकि मैं उपयोगकर्ता को ब्लूटूथ चालू करने या वाई-फाई नेटवर्क से कनेक्ट करने के लिए प्रेरित कर सकूं।
एक बग या संभवतः एक वृद्धि अनुरोध की तरह लगता है। आपको एक रडार दर्ज करना चाहिए। –