2016-09-12 10 views
9

Итак, я перехожу на iOS10, но мне также нужен мой код для работы на iOS9. Я использую CoreBluetooth и CBCentralManagerDelegate. Я могу заставить мой код работать на iOS10, но мне нужен резерв для работы с iOS9.CBCentralManager 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.

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

+0

Проверить ссылку https://forums.developer.apple.com/thread/51222 – Sujit

+0

Я попытался это, но я не мог получить их решение для работы либо – cjbatin

ответ

4

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

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

Я работал над этой проблемой на 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 
     } 
    } 
} 

Я получил идею от this forum thread, хотя они не разместили код еще.

+1

Отличная идея, но вы должны использовать: return CBCentralManagerState (rawValue: state.rawValue) ?? .Unknown. Или просто заставьте его, так как вы знаете, что это работает. – Gusutafu

+0

Отличное предложение Гусутафу! Я обновил ответ с помощью вашего более сжатого синтаксиса, используя nil coalescing. Я бы не стал разворачивать его, так как я стараюсь избегать использования оператора разворачивания силы в качестве общего правила. –

9

Вы можете просто опустить имя типа перечисления и просто использовать .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 
     } 
} 
+0

вы, сэр, выиграйте интернаты за день! это должен быть принятый ответ. –

2

функ 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 
     } 

    } 

} 
+0

Он будет работать правильно, я использовал этот код, и он работает для более низкой и верхней версии iOS. –