2016-09-12 1 views
9

Je migre donc vers iOS10 mais j'ai aussi besoin de mon code pour fonctionner sur iOS9. J'utilise CoreBluetooth et CBCentralManagerDelegate. Je peux obtenir mon code pour iOS10 mais j'ai besoin de la solution de secours pour iOS9.CBCentralManager iOS10 et 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 
     } 
    } 
} 

Je reçois l'erreur:

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

Sur la ligne:

case CBCentralManagerState.unauthorized: 

De même que pour .poweredOff et .poweredOn.

Des idées comment je peux le faire fonctionner dans les deux cas?

+0

Vérifiez ce lien https://forums.developer.apple.com/thread/51222 – Sujit

+0

J'ai essayé cela, mais je ne pouvais pas obtenir leur solution pour travailler soit – cjbatin

Répondre

4

J'ai contacté Apple à ce sujet et j'ai reçu la réponse suivante (paraphrasant). En raison de la nature changeante de swift, l'implémentation ci-dessus n'est pas possible mais vous pouvez utiliser la valeur rawValue de l'enum car l'état est identique entre les deux classes. Par conséquent, le suivant fonctionnera pour l'instant:

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

J'ai travaillé autour de ce problème sur Xcode 8 avec Swift 2.3 (ciblant iOS 8 et plus) en créant une propriété d'extension sur CBCentralManager qui est de l'ancien type enum, CBCentralManagerState. Je l'ai appelé centralManagerState. Je me réfère à CBCentralManager.centralManagerState où je me référais à CBCentralManager.state.

extension CBCentralManager { 

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

J'eu l'idée de this forum thread mais ils n'avaient pas encore posté le code.

+1

Excellente idée, mais vous devez utiliser: return CBCentralManagerState (rawValue: state.rawValue) ?? .Inconnu. Ou juste le forcer, puisque vous savez que cela fonctionne. – Gusutafu

+0

Grande suggestion Gusutafu! J'ai mis à jour la réponse avec votre syntaxe plus succincte en utilisant la coalescence nulle. Je ne forcerais pas à le déballer puisque j'essaie d'éviter d'utiliser l'opérateur de dépliage de force en règle générale. –

9

Vous pouvez simplement omettre le nom du type d'énumération et il suffit d'utiliser la .value. Cela compilera sans avertissements et fonctionne sur iOS 10 et plus tôt puisque les valeurs brutes sous-jacentes sont compatibles.

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

vous, monsieur, gagner les internets pour la journée! cela devrait être la réponse acceptée. –

2

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 
     } 

    } 

} 
+0

Cela fonctionnera correctement, j'ai utilisé ce code et cela fonctionne pour la version inférieure et supérieure d'iOS. –