10

周辺機器を正常に検出し、そのローカル名を取得しました。

[advertisementData objectForKey:CBAdvertisementDataLocalNameKey]

ただし、ペリフェラルが別のローカル名でアドバタイズを停止して再開した場合、クライアントは変更を認識しません。私は推測する

- (void)peripheralDidUpdateName:(CBPeripheral *)peripheral

2つのデバイスがペアになっている場合にのみ機能します。ペアリングせずにアップデートを取得する方法はありますか?

4

2 に答える 2

5

アップルのバグ。iOS 6.1 にはまだ存在します。CBキャッシュをリセットする方法は次のとおりです。

  1. デバイスを iCloud にバックアップします。
  2. ネットワーク設定をリセットします。
  3. アプリを削除し、Xode 経由で再度インストールする
  4. この時点で、周辺機器が新しい名前で表示されます。
  5. ネットワーク設定を手動で復元するか、iCloud から復元します。

ごめん。

于 2013-02-04T05:03:24.240 に答える
0

接続されていない場合でも機能する name プロパティで KVO を使用できます。少なくともこれは OS X 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];
    }
}
于 2014-11-04T00:22:17.717 に答える