3 Stimmen

DidDiscoverPeripheral wird nach dem Upgrade von iOS 7 auf iOS 8 nicht aufgerufen.

Ich rufe scanForPeripheralsWithServices aus dem didFinishLaunchingWithOptions-Callback des AppDelegate auf. Der Code sieht so aus:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
    NSLog(@"didFinishLaunchingWithOptions");
    // Override point for customization after application launch.
    cm = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
    [cm scanForPeripheralsWithServices:nil
                               options:nil];
}

- (void) centralManager:(CBCentralManager*)central didDiscoverPeripheral:(CBPeripheral*)peripheral advertisementData:(NSDictionary*)advertisementData RSSI:(NSNumber*)RSSI{

   NSLog(@"Did discover peripheral %@", peripheral.name);

   [cm stopScan];
}

Vor dem Upgrade auf iOS 8 hat alles gut funktioniert, aber nach dem Upgrade (genau der gleiche Code, keine einzige Zeile wurde geändert) erhalte ich keine Fehlermeldung, aber auch didDiscoverPeripheral wird nicht aufgerufen.

4voto

Steve Punkte 154

Es scheint, dass die wesentliche Veränderung, die mit Core Bluetooth in iOS 8 aufgetreten ist, darin besteht, dass der BLE-Stack nicht eingeschaltet ist, bis Sie versuchen, eine Verbindung herzustellen (oder möglicherweise einen anderen Befehl auszugeben).

CBCentralManager *cbCentralManager;
[cbCentralManager scanForPeripheralsWithServices:...];

Dieser Aufruf löste früher eine Warnung im Xcode-Debugprotokoll aus, die besagte, dass der zentrale Manager eingeschaltet sein musste, bevor er verwendet werden konnte. Diese Warnung war jedoch immer ein Teufelskreis - der einzige Weg, den zentralen Manager einzuschalten, bestand darin, ihm eine Nachricht zu senden, und der einzige Weg für ihn, eine Nachricht zu verarbeiten, bestand darin, dass er eingeschaltet war.

Apple scheint dieses Problem gelöst zu haben, indem es das Einschalten etwas anders behandelt. Jetzt teilt der zentrale Manager nach dem Ausführen des obigen Befehls seinem Delegaten mit, dass sich sein Zustand geändert hat über centralManagerDidUpdateState:.

Wir haben das von Ihnen beschriebene Problem gelöst, indem wir auf centralManagerDidUpdateState: reagiert haben, indem wir die Nachricht scanForPeripherals... erneut gesendet haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X