iOS蓝牙无法发现外围设备服务(有时候!)

3
有时,我的应用程序会连接到外围设备(即“ didConnectPeripheral”被调用),但它不会发现可用服务(“ didDiscoverServices”未被调用)。当这种情况发生时,外围设备(基于nRF8001的Adafruit Bluefruit)会说它没有连接!这只会在启动应用程序约五分之一的时间发生。
以下代码块始终执行:
func centralManager(central: CBCentralManager!, didDiscoverPeripheral peripheral: CBPeripheral!, advertisementData: [NSObject : AnyObject]!, RSSI: NSNumber!) {
     //Connect to the peripheral if its a UART
    if(peripheral.name == "UART") {
        currentPeripheral = peripheral
        currentPeripheral.delegate = self
        central.connectPeripheral(currentPeripheral, options: nil) 
    }
}


 func centralManager(central: CBCentralManager!, didConnectPeripheral peripheral: CBPeripheral!) {
    println()
    println("Connected to: \(peripheral.name)")
    peripheral.discoverServices(nil)
    connectionStatus = .Connected
    central.stopScan()
    println("***Stopped scanning***")
}

有没有想法为什么 "didDiscoverServices" 没有被调用?(我在第五代IPod touch上运行应用程序)

你是否保留了“外围设备”的引用? - Larme
如果您执行 currentPeripheral.discoverServices(nil) 而不是 peripheral.discoverServices(nil),会发生什么? - Larme
是的,一旦发现外围设备,我会保留对其的引用。(我已编辑我的帖子) - Faris
我执行了 currentPeripheral.discoverServices(nil),结果还是一样的。 - Faris
你解决了这个问题吗?我现在也遇到了类似的问题。iOS显示已连接,但无法发现服务,而外设声称未收到任何连接尝试。我们在应用程序和使用nRF Connect中都进行了测试。两者表现相同。 - mmatous
1个回答

4
根据CoreBluetooth编程指南,您应该这样做:

在与外围设备进行交互之前,您应该将外围设备的代理设置为确保其接收适当的回调,如下所示:

peripheral.delegate = self;

因此,您的didConnectPeripheral函数应该如下所示:
func centralManager(central: CBCentralManager!, didConnectPeripheral peripheral: CBPeripheral!) {
        NSLog("peripheral connected")
        peripheral.delegate = self
        peripheral.discoverServices(nil)

    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接