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 and .poweredOn.

любые идеи, как я могу заставить его работать в обоих случаях?

4 ответов


вы можете просто опустить имя типа перечисления и просто использовать .значение. Это будет компилироваться без предупреждений и работает на 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
        }
}

Я работал над этой проблемой на Xcode 8 С Swift 2.3 (таргетинг на iOS 8 и выше), создав свойство расширения на CBCentralManager который имеет старый тип перечисления,CBCentralManagerState. Я назвал его centralManagerState. Я имею в виду CBCentralManager.centralManagerState где я имел обыкновение ссылаться на CBCentralManager.state.

extension CBCentralManager {

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

я получил идею от эта ветка форума хотя они еще не опубликовали код.


Я связался с Apple об этом и получил следующий ответ (перефразирование).

из-за изменяющегося характера swift вышеуказанная реализация невозможна, однако вы можете использовать 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 (центральный: 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
        }

    }

}