2016-09-12 22 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 
     } 
    } 
} 

私はエラーを取得する:

case CBCentralManagerState.unauthorized: 

だけでなく.poweredOffと.poweredOn用:行で

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

どちらの場合でもどのように動作させることができますか?

+0

このリンク をチェックhttps://forums.developer.apple.com/thread/51222 – Sujit

+0

私はこれを試してみましたが、私はできませんでしたどちらかの解決策を得るには – cjbatin

答えて

4

私はこれについてAppleに連絡し、以下の応答(言い換え)を与えました。

swiftの性質が変化するため、上記の実装は不可能ですが、enumのrawValueは2つのクラス間の状態が同じであるため使用できます。したがって、以下は今のために動作します:あなたは、単に列挙型の名前を省略し、単に.VALUEを使用することができます

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

この問題は、古い列挙型のCBCentralManagerという拡張プロパティーを作成して、Swift 2.3(iOS 8以上をターゲットとする)のXcode 8でこの問題を解決しました。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)?? 。未知の。または、あなたがそれが動作することを知っているので、それを強制するだけです。 – Gusutafu

+0

グスタフ大募集! nil coalescingを使って、あなたのより簡潔な構文で答えを更新しました。私は一般的なルールとして力unwrap演算子を使用しないようにしようとするので、私はunwrapを強制しません。 –

9

。これは警告なしでコンパイルし、iOS 10以前のバージョンで動作します。これは、元のraw値が互換性があるためです。

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

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 
     } 

    } 

} 
+0

これは正しく動作しますが、私はこのコードを使用していて、iOSの下位バージョンと上位バージョンで動作します。 –

関連する問題