CBCentralManager iOS10和iOS9

所以我正在迁移到iOS10,但我也需要我的代码在iOS9上运行。 我正在使用CoreBluetooth和CBCentralManagerDelegate。 我可以让我的代码在iOS10上工作,但是我需要为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 } } } 

我得到的错误:

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

在线上:

 case CBCentralManagerState.unauthorized: 

以及为.poweredOff和.poweredOn。

任何想法如何让它在两种情况下工作?

您可以简单地省略枚举types名称,只使用.value 。 由于底层原始值是兼容的,因此它将在没有警告的情况下进行编译并在iOS 10及更早版本上运行。

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

我使用Swift 2.3(针对iOS 8及以上)在Xcode 8上解决了这个问题,方法是在CBCentralManager上创build一个旧的枚举typesCBCentralManagerState 。 我把它命名为centralManagerState 。 我指的是我曾经用来引用CBCentralManager.state

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

我从这个论坛主题得到的想法,虽然他们还没有发布代码。

我就此与苹果公司联系,并得到以下回复(转述)。

由于swift的性质不同,上面的实现是不可能的,但是可以使用enum的rawValue,因为两个类之间的状态是相同的。 因此,以下将现在工作:

 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(string: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(string:TRANSFER_UUID)], options:[CBCentralManagerScanOptionAllowDuplicatesKey: false]) print("Bluetooth is currently powered on and available to use.") default:break } } }