2012-11-01 22 views
9

tôi khám phá thành công một thiết bị ngoại vi và lấy tên địa phương của nó:CoreBluetooth: Refreshing tên địa phương của một đã phát hiện ra ngoại vi

[advertisementData objectForKey:CBAdvertisementDataLocalNameKey] 

Nhưng nếu ngoại vi dừng và khởi động lại quảng cáo với một tên địa phương khác nhau, khách hàng không nhận ra sự thay đổi. Tôi đoán

- (void)peripheralDidUpdateName:(CBPeripheral *)peripheral 

chỉ hoạt động nếu hai thiết bị được ghép nối. Có cách nào để nhận bản cập nhật mà không ghép nối không?

Trả lời

5

Lỗi của Apple. Vẫn có trong iOS 6.1. Đây là mẹo để đặt lại bộ nhớ cache CB:

  1. Thiết bị sao lưu vào iCloud.
  2. Đặt lại cài đặt mạng.
  3. Xóa ứng dụng của bạn và cài đặt lại ứng dụng qua Xode
  4. Tại thời điểm này, thiết bị ngoại vi của bạn sẽ xuất hiện với tên mới.
  5. Khôi phục cài đặt mạng của bạn theo cách thủ công hoặc khôi phục từ iCloud.

Xin lỗi.

+5

oh boy oh boy .. API CoreBluetooth như vậy flakey .. (UUIDs null, vấn đề ngu ngốc bộ nhớ cache .. arrrr) – mindbomb

+2

Đáng buồn thay, vẫn còn hiện diện trong iOS8 :( – christophercotton

+0

này là nhận được vô lý và thực sự bực bội. – Bach

0

Bạn có thể sử dụng KVO trên thuộc tính tên sẽ hoạt động ngay cả khi không được kết nối, ít nhất đây là trường hợp trong OS X 10.10. Tôi chỉ sử dụng điều này để gọi phương thức -peripheralDidUpdateName: bản thân mình và hủy cuộc gọi bằng cách theo dõi chuỗi tên.

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]; 
    } 
}