2016-09-12 14 views
9

그래서 iOS10으로 이전 중이지만 iOS9에서 실행하려면 코드가 필요합니다. 나는 CoreBluetooth와 CBCentralManagerDelegate를 사용하고 있습니다. iOS10에서 작동하도록 코드를 만들 수 있지만 iOS9에서도 작동하도록 폴백이 필요합니다. 라인에CBCentralManager iOS10 및 iOS9

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

:

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에 대한

.

어떻게 두 가지 방법으로 작동시킬 수 있습니까?

+0

확인이 링크 https://forums.developer.apple.com/thread/51222 – Sujit

+0

나는이 시도하지만 난 할 수 없었다 그들의 솔루션을 어느 쪽이든 작동 시키려면 – cjbatin

답변

4

나는 이것에 관해 애플에 연락했고 다음과 같은 반응 (의역을 말함)을 받았다.

swift의 특성이 변하기 때문에 위의 구현은 불가능하지만 enum의 rawValue는 두 클래스간에 동일한 상태이므로 사용할 수 있습니다. 따라서 다음이 지금 작동합니다 : 당신은 단순히 열거 형 이름을 생략하고 바로 .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

CBCentralManagerStateCBCentralManager에 확장 속성을 만들어서 Swift 2.3 (Xcode 8 이상 포함)의 Xcode 8에서이 문제를 해결했습니다. 나는 그것을 centralManagerState이라고 지었다. 내가 CBCentralManager.state을 참조하는 데 사용한 CBCentralManager.centralManagerState을 참조하십시오.

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 operator를 일반적인 규칙으로 사용하지 않기 때문에 unwrap을 강요하지 않을 것이다. –

9

. 이는 경고없이 컴파일되며 기본 원시 값이 호환 가능하므로 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

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의 하위 버전과 상위 버전에서 작동합니다. –

관련 문제