【问题标题】:CBCentralManager iOS10 and iOS9CBCentralManager iOS10 和 iOS9
【发布时间】:2017-01-19 21:42:11
【问题描述】:

所以我正在迁移到 iOS10,但我还需要我的代码在 iOS9 上运行。我正在使用 CoreBluetooth 和 CBCentralManagerDelegate。我可以让我的代码在 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。

有什么想法可以让它在这两种情况下都能正常工作吗?

【问题讨论】:

标签: ios swift ios9 core-bluetooth ios10


【解决方案1】:

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
        }

    }

}

【讨论】:

  • 它会正常工作,我已经使用了这个代码,它适用于iOS的低版本和高版本。
【解决方案2】:

我在 Xcode 8 上使用 Swift 2.3(针对 iOS 8 及更高版本)解决了这个问题,方法是在旧枚举类型 CBCentralManagerStateCBCentralManager 上创建扩展属性。我将其命名为centralManagerState。我指的是CBCentralManager.centralManagerState,以前我指的是CBCentralManager.state

extension CBCentralManager {

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

我从this forum thread 那里得到了这个想法,虽然他们还没有发布代码。

【讨论】:

  • 好主意,但你应该使用:return CBCentralManagerState(rawValue: state.rawValue) ?? 。未知。或者只是强迫它,因为你知道它有效。
  • 伟大的建议 Gusutafu!我使用 nil 合并以更简洁的语法更新了答案。我不会强制展开它,因为我尽量避免使用强制展开运算符作为一般规则。
【解决方案3】:

您可以简单地省略枚举类型名称而只使用 .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
        }
}

【讨论】:

  • 您,先生,今天赢得了互联网!这应该是公认的答案。
【解决方案4】:

我就此联系了 Apple,得到了以下回复(释义)。

由于 swift 的性质不断变化,上述实现是不可能的,但是您可以使用枚举的 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
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 2014-11-14
    • 2014-06-09
    • 2015-06-09
    • 2015-10-13
    • 1970-01-01
    相关资源
    最近更新 更多