CBCentralManager iOS10 et iOS9

Donc, je migre vers iOS10 mais j'ai aussi besoin de mon code pour fonctionner sur iOS9. J'utilise CoreBluetooth et CBCentralManagerDelegate. Je peux get mon code pour iOS10 mais j'ai besoin de la solution de secours pour iOS9.

func centralManagerDidUpdateState(_ central: CBCentralManager) { if #available(iOS 10.0, *) { switch central.state{ case CBManagerState.unauthorized: print("This app is not authorised to use Bluetooth low energy") case CBManagerState.poweredOff: print("Bluetooth is currently powered off.") case CBManagerState.poweredOn: print("Bluetooth is currently powered on and available to use.") default:break } } else { // Fallback on earlier versions switch central.state{ case CBCentralManagerState.unauthorized: print("This app is not authorised to use Bluetooth low energy") case CBCentralManagerState.poweredOff: print("Bluetooth is currently powered off.") case CBCentralManagerState.poweredOn: print("Bluetooth is currently powered on and available to use.") default:break } } } 

J'ai l'erreur:

 Enum case 'unauthorized' is not a member of type 'CBManagerState' 

Sur la ligne:

 case CBCentralManagerState.unauthorized: 

Ainsi que pour .poweredOff et .poweredOn.

Des idées comment je peux le faire fonctionner dans les deux cas?

Vous pouvez simplement omettre le nom du type d'énumération et utiliser simplement le .value . Cela comstackra sans avertissements et fonctionne sur iOS 10 et plus tôt puisque les valeurs brutes sous-jacentes sont compatibles.

 func centralManagerDidUpdateState(_ central: CBCentralManager) { switch central.state{ case .unauthorized: print("This app is not authorised to use Bluetooth low energy") case .poweredOff: print("Bluetooth is currently powered off.") case .poweredOn: print("Bluetooth is currently powered on and available to use.") default:break } } 

J'ai travaillé autour de ce problème sur Xcode 8 avec Swift 2.3 (en ciblant iOS 8 et plus) en créant une propriété d'extension sur CBCentralManager qui est de l'ancien type enum, CBCentralManagerState . Je l'ai nommé centralManagerState . Je me réfère à CBCentralManager.centralManagerState où je me CBCentralManager.state à CBCentralManager.state .

 extension CBCentralManager { internal var centralManagerState: CBCentralManagerState { get { return CBCentralManagerState(rawValue: state.rawValue) ?? .Unknown } } } 

J'ai eu l'idée de ce fil de discussion bien qu'ils n'aient pas encore posté le code.

J'ai contacté Apple à ce sujet et a reçu la réponse suivante (paraphrasant).

En raison de la nature changeante de swift, l'implémentation ci-dessus n'est pas possible mais vous pouvez utiliser la valeur rawValue de l'enum car l'état est identique entre les deux classs. Par conséquent, ce qui suit fonctionnera pour le moment:

 func centralManagerDidUpdateState(_ central: CBCentralManager) { if #available(iOS 10.0, *) { switch central.state{ case CBManagerState.unauthorized: print("This app is not authorised to use Bluetooth low energy") case CBManagerState.poweredOff: print("Bluetooth is currently powered off.") case CBManagerState.poweredOn: print("Bluetooth is currently powered on and available to use.") default:break } } else { // Fallback on earlier versions switch central.state.rawValue { case 3: // CBCentralManagerState.unauthorized : print("This app is not authorised to use Bluetooth low energy") case 4: // CBCentralManagerState.poweredOff: print("Bluetooth is currently powered off.") case 5: //CBCentralManagerState.poweredOn: print("Bluetooth is currently powered on and available to use.") default:break } } } 

func centralManagerDidUpdateState (central: CBCentralManager) {

  if #available(iOS 10.0, *) { switch (central.state) { case CBManagerState.PoweredOff: print("CBCentralManagerState.PoweredOff") case CBManagerState.Unauthorized: // Indicate to user that the iOS device does not support BLE. print("CBCentralManagerState.Unauthorized") break case CBManagerState.Unknown: // Wait for another event print("CBCentralManagerState.Unknown") break case CBManagerState.PoweredOn: print("CBCentralManagerState.PoweredOn") self.centralManager!.scanForPeripheralsWithServices([CBUUID(ssortingng:TRANSFER_UUID)], options:[CBCentralManagerScanOptionAllowDuplicatesKey: false]) case CBManagerState.Resetting: print("CBCentralManagerState.Resetting") case CBManagerState.Unsupported: print("CBCentralManagerState.Unsupported") break } } else { switch central.state.rawValue { case 0: // CBCentralManagerState.Unknown print("CBCentralManagerState.Unknown") break case 1: // CBCentralManagerState.Resetting print("CBCentralManagerState.Resetting") case 2:// CBCentralManagerState.Unsupported print("CBCentralManagerState.Unsupported") break case 3: // CBCentralManagerState.unauthorized print("This app is not authorised to use Bluetooth low energy") break case 4: // CBCentralManagerState.poweredOff: print("Bluetooth is currently powered off.") case 5: //CBCentralManagerState.poweredOn: self.centralManager!.scanForPeripheralsWithServices([CBUUID(ssortingng:TRANSFER_UUID)], options:[CBCentralManagerScanOptionAllowDuplicatesKey: false]) print("Bluetooth is currently powered on and available to use.") default:break } } }