2012-11-01 18 views
9

का स्थानीय नाम रिफ्रेशिंग मैं सफलतापूर्वक एक परिधीय की खोज और उसके स्थानीय नाम पुनः प्राप्त:CoreBluetooth: एक पहले से ही पता चला परिधीय

[advertisementData objectForKey:CBAdvertisementDataLocalNameKey] 

लेकिन अगर परिधीय बंद हो जाता है और पुन: प्रारंभ एक अलग स्थानीय नाम के साथ विज्ञापन, ग्राहक नहीं है परिवर्तन को पहचानें। मुझे लगता है कि

- (void)peripheralDidUpdateName:(CBPeripheral *)peripheral 

केवल दो डिवाइस जोड़े जाने पर ही काम करता है। बिना जोड़े के अपडेट प्राप्त करने का कोई तरीका है?

उत्तर

5

ऐप्पल की बग। आईओएस 6.1 में अभी भी मौजूद है। सीबी कैश को रीसेट करने का तरीका यहां दिया गया है:

  1. बैक अप डिवाइस iCloud पर।
  2. नेटवर्क सेटिंग्स रीसेट करें।
  3. अपने ऐप को हटाएं और इसे Xode
  4. के माध्यम से वापस इंस्टॉल करें इस बिंदु पर, आपका परिधीय नए नाम के साथ दिखाई देगा।
  5. अपने नेटवर्क सेटिंग्स को मैन्युअल रूप से पुनर्स्थापित करें या iCloud से पुनर्स्थापित करें।

क्षमा करें।

+5

ओह लड़का ओह लड़के .. CoreBluetooth एपीआई है तो flakey .. (शून्य UUIDs, बेवकूफ कैश मुद्दों .. arrrr) – mindbomb

+2

iOS8 :( – christophercotton

+0

में दुख की बात है, अभी भी मौजूद यह हास्यास्पद है और वास्तव में निराशा होती जा रही है। – Bach

0

आप नाम संपत्ति पर केवीओ का उपयोग कर सकते हैं जो कनेक्ट होने पर भी काम करेगा, कम से कम यह ओएस एक्स 10.10 में मामला है। मैं बस इसका उपयोग करने के लिए -peripheralDidUpdateName: विधि विधि, और नाम स्ट्रिंग को ट्रैक करके डी-डुप्ले कॉल को कॉल करने के लिए उपयोग करता हूं।

self.name = self.peripheral.name; 
[self.peripheral addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:NULL]; 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    if([keyPath isEqualToString:@"name"]) { 
     [self peripheralDidUpdateName:self.peripheral]; 
     return; 
    } 
    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; 
} 


- (void)peripheralDidUpdateName:(CBPeripheral *)peripheral { 
    if([peripheral.name isEqualToString:self.name]) return; 
    if([self.delegate respondsToSelector:@selector(peripheralDidUpdateName:)]) { 
     [self.delegate peripheralDidUpdateName:self]; 
    } 
}