2016-09-12 31 views
9

Przeprowadzam migrację do iOS10, ale potrzebuję również kodu do uruchomienia na iOS9. Używam CoreBluetooth i CBCentralManagerDelegate. Mogę sprawić, by mój kod działał na iOS10, ale potrzebuję również funkcji awaryjnej do pracy z iOS9.CBCentralManager iOS10 i 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 
     } 
    } 
} 

pojawia się błąd:

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

Na linii:

case CBCentralManagerState.unauthorized: 

jak również dla .poweredOff i .poweredOn.

Jakieś pomysły, w jaki sposób mogę je uruchomić w obu przypadkach?

+0

Sprawdź ten link https://forums.developer.apple.com/thread/51222 – Sujit

+0

próbowałem tego, ale nie mogłem otrzymasz swoje rozwiązanie do pracy albo – cjbatin

Odpowiedz

4

Skontaktowałem się z Apple w tej sprawie i otrzymałem następującą odpowiedź (parafrazując).

Ze względu na zmieniający się charakter szybkiego, powyższa implementacja nie jest możliwa, ale można użyć wartości surowej kolumny wyliczeniowej, ponieważ stan jest identyczny między dwiema klasami. Dlatego dodaje zadziała teraz:

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

Obejrzałem ten problem w Xcode 8 za pomocą Swift 2.3 (kierowanie na system iOS 8 i nowsze), tworząc właściwość rozszerzenia na CBCentralManager, która jest ze starego typu wyliczeniowego, CBCentralManagerState. Nazwałem to centralManagerState. Odnoszę się do CBCentralManager.centralManagerState, gdzie zwykle mówiłem o CBCentralManager.state.

extension CBCentralManager { 

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

Wpadłem na pomysł z this forum thread, chociaż jeszcze nie napisali kodu.

+1

Świetny pomysł, ale powinieneś użyć: return CBCentralManagerState (rawValue: state.rawValue)? .Nieznany. Lub po prostu go wymuszaj, ponieważ wiesz, że to działa. – Gusutafu

+0

Świetna propozycja Gusutafu! Zaktualizowałem odpowiedź twoją bardziej zwięzłą składnią, używając zerowego koalescencji. Nie zmusiłbym go do rozwinięcia, ponieważ staram się unikać używania operatora odwijającego siły jako ogólnej zasady. –

9

można po prostu pominąć nazwę typu wyliczenie i wystarczy użyć .Value. Spowoduje to kompilację bez ostrzeżeń i działa na iOS 10 i wcześniejszych, ponieważ podstawowe wartości są zgodne.

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

ty, proszę pana, wygraj internet na cały dzień! to powinna być zaakceptowana odpowiedź. –

2

func centralManagerDidUpdateState (centralne: 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

To będzie działać poprawnie, użyłem tego kodu i działa on dla niższej i wyższej wersji iOS. –