2014-09-26 16 views
8

मुझे आईओएस 8 अपडेट के बाद कोई समस्या आई है, अभी मेरा ऐप एक बीएलई डिवाइस से जुड़ा हुआ है और समय-समय पर आरएसएसआई को टाइमर और ReadRSSI विधि के लिए धन्यवाद देता है।ReadRSSI प्रतिनिधि विधि को कॉल नहीं करता

readRSSI विधि को कॉल किया जाता है (ब्रेकपॉइंट के साथ चेक किया जाता है) ताकि जब तक यह सब कुछ ठीक न हो।

प्रलेखन readRSSI बुला कॉलबैक

- (void)peripheral:(CBPeripheral *)peripheral didReadRSSI:(NSNumber *)RSSI error:(NSError *)error 

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

+0

परिधीय से कनेक्ट करने का प्रयास करें [एक समान प्रश्न के मेरे उत्तर] (http://stackoverflow.com/a/27030526/4272525)। –

+0

मुझे अपने आईफोन को फिर से काम करने के लिए रीसेट करना पड़ा, पावर और होम बटन पकड़े हुए। – marcelosalloum

उत्तर

4

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

मैंने बीएलई बीकन से कनेक्ट करने के लिए आईफोन का उपयोग करके इसी तरह के कार्यक्रम को लिखा, और संकेत शक्ति प्राप्त करने के लिए [सीबीपीरफेरल रीडआरएसएसआई] का उपयोग किया। जब बीएलई बीकन पहली बार मेरे आईफोन से जुड़ा होता है तो सब कुछ आसान हो जाता है। लेकिन अगर यह डिस्कनेक्ट हो गया है, और फिर से कनेक्ट हो गया है, तो विधि पढ़ने के लिए आरएसएसआई को और नहीं बुलाया जाएगा। मेरे आईफोन पर ब्लूटूथ को पुनरारंभ करने के बाद ही, समस्या हल हो जाएगी।

मैं प्रोग्राम को डीबग मोड में चलाता हूं, चरण-दर-चरण, मेरे आश्चर्य के लिए, मुझे कोई समस्या नहीं मिली। यहां तक ​​कि मैं कई बार डिस्कनेक्ट करता हूं और दोबारा जुड़ता हूं, विधि पढ़ने के लिए आरएसएसआई को अभी भी ठीक से बुलाया जा सकता है।

आशा है कि इससे मदद मिल सकती है। मैं इस अजीब चीज के जवाब का भी इंतजार कर रहा हूं।

+0

आपके उत्तर के लिए धन्यवाद, मैंने अभी एक ऐप्पल बग रिपोर्ट भर दी है, मैं आपको –

+0

पोस्ट कर दूंगा, इसलिए ऐप्पल ने मेरी बग को # 18476 9 71 के डुप्लिकेट के रूप में बंद कर दिया है, लेकिन मैं इसका उपयोग नहीं कर सकता, इसलिए मुझे ऐप्पल जांच –

+0

का कोई संकेत नहीं है मुझे लगता है कि उन्होंने इस मुद्दे को पहले ही महसूस कर लिया है, ऐसा लगता है कि बीओएल को आईओएस 8 में बहुत सारी समस्याएं हैं। –

1

मेरे पास 8.0 है, यह ठीक काम कर रहा है।

-(void) startScanForRSSI{ 

    timerRSSI = [NSTimer scheduledTimerWithTimeInterval:10.0f target:self selector:@selector(detectRSSI) userInfo:nil repeats:YES]; 

} 

- (void)detectRSSI { 

    if (state == ...) { 
     peripheral.delegate = self; 
     [peripheral readRSSI]; 
    } else { 
     if (timerRSSI && [timerRSSI isValid]) { 
      [timerRSSI invalidate]; 
     } 
    } 
} 



- (void)peripheralDidUpdateRSSI:(CBPeripheral *)peripheral error:(NSError *)error { 



    NSLog(@"Got RSSI update: %4.1f", [peripheral.RSSI doubleValue]); 


    NSNumber *rssiNum = peripheral.RSSI; 
} 

ऊपर के बाद से iOS 8 में हटाई गई है, अन्य प्रतिनिधि की कोशिश कर रहा है, वापस रिपोर्ट करेंगे।

-(void) peripheral:(CBPeripheral *)peripheral didReadRSSI:(NSNumber *)RSSI error:(NSError *)error { 
    NSLog(@"Got RSSI update in didReadRSSI : %4.1f", [RSSI doubleValue]); 
} 

यह एक ओएसएक्स प्रतिनिधि विधि प्रतीत होता है। आरएसएसआई के लिए आईओएस में ऐप्पल जल्द ही कुछ जोड़ देगा।

आईओएस 8.0 में didReadRSSI काम कर रहा है। 8.0.2 दस्तावेज में यह आईओएस के तहत सूचीबद्ध नहीं है।

अगर मैं दोनों तरीकों didReadRSSI आईओएस में कहा जाता हो जाता है 8 & peripheralDidUpdateRSSI आईओएस 7.

में बुलाया जाता है तो आईओएस 8.0.2 को अपडेट नहीं करते सेब RSSI के लिए कुछ कहते हैं जब तक डाल दिया।

क्या किसी ने आईओएस 8.1 बीटा की कोशिश की?

ऐसा लगता है कि आरएसएसआई को पढ़ा नहीं जा सकता है। यदि कॉल [CBCentralManager scanForPeripheralsWithServices ...] को कॉल किया गया है तो ReadRSSI का कोई प्रभाव नहीं होता है (कोई प्रतिनिधि नहीं कहा जाता है)। लेकिन अगर [CBCentralManager stopScan] जारी किया जाता है तो ReadRSSI प्रतिसाद देना शुरू कर देता है।

यह भी ध्यान दें: डिवाइस को आदेश जारी करने के लिए कनेक्ट राज्य में होना चाहिए अन्यथा आपको मिल जाएगा: कोरब्लूथूट [एपीआई मिसयू] सीबीपीरिफेरल केवल कनेक्ट स्थिति में कमांड स्वीकार कर सकता है।

2

मैंने हाल ही में इस मुद्दे में भाग लिया और मेरे पास कई समस्याएं थीं जो इसका कारण बन रही थीं।यहाँ चेकलिस्ट फैशन में समाधान, सरल से सबसे जटिल करने के तरीके:

  1. CBCentralManagerperipheral के लिए एक मजबूत संदर्भ पकड़ नहीं होगा, तो आप इसे अपने आप को रखने की जरूरत है।
  2. सुनिश्चित करें कि आप वास्तव में peripheral.delegate हों।
  3. सुनिश्चित करें कि आप नई विधि peripheral(peripheral:didReadRSSI:error:) लागू कर रहे हैं और पुराने नहीं।
  4. आईओएस 8.0.2 उपर्युक्त विधि के साथ मुद्दों को पेश किया, 8.1, 8.2, 8.3 के बाद कोई भी संस्करण बिना किसी समस्या के काम करता है (क्या @ गामा-प्वाइंट उल्लेख कर रहा था)।
  5. आप केवल readRSSI कि से जुड़े हैं उपकरणों के लिए अपने केंद्रीय है, तो कर सकते हैं:
    1. उपकरणों कि खोज के द्वारा प्राप्त के लिए, आप [CBCentralManagerScanOptionAllowDuplicatesKey : true] जब scanForPeripheralsWithServices(_:options:) कर पारित कर सकते हैं। जैसा कि this answer में देखा गया है।
    2. इसके अलावा, central.retrieveConnectedPeripheralsWithServices विधि के साथ एक गॉचा है। यह विधि "कनेक्टेड" डिवाइस लौटाती है, लेकिन readRSSI और न ही सेवा खोज कार्य जब तक आप वास्तव में connectPeripheral(_:options:) पर कॉल नहीं करते हैं, भले ही वे आईफोन/आईपैड/ऐप्पलवॉच से जुड़े हों, फिर भी वे से केंद्रीय, बहुत परेशान नहीं हैं।

यह पिछले एक मेरे लिए बड़ा पकड़ लिया था, मैं जुड़ा या पता चला डिवाइस "निकटतम लेने" की उम्मीद कर रहा था, लेकिन RSSI उन पर अद्यतन नहीं रह सका। दस्तावेज़ीकरण कुछ भी नहीं कहता है।

मैं जो कर रहा हूं, [UUID : Device] द्वारा अनुक्रमित सभी उपकरणों के साथ एक बड़ा शब्दकोश बनाना था (डिवाइस CBPeripheral के लिए एक रैपर होने वाला)। खोज के माध्यम से जोड़ा डिवाइस उनके RSSI के माध्यम से डी विधि की खोज अपडेट कर दिया है, और ब्लूटूथ कतार कि readRSSI कॉल करता है और अपने स्वयं के RSSI पढ़ने अद्यतन पर एक GCD टाइमर के माध्यम से जुड़े लोगों को।

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