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