macOS CBCentralManager状态不受支持

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了macOS CBCentralManager状态不受支持相关的知识,希望对你有一定的参考价值。

我试图在macOS(2017 iMac)上访问蓝牙外设,但CBCentralManager似乎永远不会进入.poweredOn状态。

import Cocoa
import CoreBluetooth

class BluetoothManager: NSObject {
  var centralManager: CBCentralManager!
  override init() {
    super.init()
    self.centralManager = CBCentralManager(delegate: self, queue:nil)
    self.checkState()
  }

  func checkState() {
    print("central state: (self.centralManager?.state.rawValue ?? -1)")
    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + .seconds(2), execute: {
      self.checkState()
    })
  }
}


extension BluetoothManager: CBCentralManagerDelegate {
  func centralManagerDidUpdateState(_ central: CBCentralManager) {
    switch central.state {
    case .poweredOn:
      print("Power on")
    case .unsupported:
      print("Unsupported")
    default:break
    }
  }
}


@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

  var bluetoothManager: BluetoothManager?

  func applicationDidFinishLaunching(_ aNotification: Notification) {
    self.bluetoothManager = BluetoothManager()

  }

  ...

}

这将持续输出Unsupported,并带有控制台警告

[CoreBluetooth] XPC connection invalid

我知道Info.plist密钥NSBluetoothPeripheralUsageDescription,我尝试过,但我相信这只适用于ios设备。

我是否在寻找在iMac上管理蓝牙的错误方向?或者我的实现缺少什么?我觉得我已经涵盖了Core Bluetooth documentation所需的一切。

答案

我相信这是因为启用了App Sandbox(在Capabilities项目中找到)。

启用Bluetooth(在Hardware下),并接受对权利文件的自动更改解决了问题。

也禁用App Sandbox似乎工作,但我知道这是否安全。

作为参考,我的权利文件现在看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">  
<plist version="1.0">   
<dict>  
    <key>com.apple.security.app-sandbox</key>
    <true/>
    <key>com.apple.security.device.bluetooth</key>
    <true/>
    <key>com.apple.security.files.user-selected.read-only</key>
    <true/>
</dict> 
</plist>    

以上是关于macOS CBCentralManager状态不受支持的主要内容,如果未能解决你的问题,请参考以下文章

ios- cbcentralManager 状态未知且 CoreBluetooth[WARNING] <CBConcreteCentralManager> 未通电

核心蓝牙 CBCentralManager 总是在 ipad2 上报告状态为未知

xamarin ios 应用程序因 CBCentralManager 崩溃

多个 CBCentralManager 实例?

是否可以使用 CBPeripheral 通过蓝牙从 iOS 连接到 macOS

使用 CoreBluetooth/CBCentralManager.h 框架