Search code examples
iosobjective-cbluetooth-lowenergycore-bluetoothios-bluetooth

iOS BLE disconnecting right after connection, only restarting device helps


My app uses BLE (Bluetooth 4) to connect to a physical peripheral. My users and I have repeatedly encountered a bug where, at some point, the app stops connecting to the peripheral - you can see an indication that the BLE peripheral is discovered and the connection was established, but then few seconds after, the connection is dropped.

Things go back to normal only after restarting the iDevice.

I’ve done a very long work on checking it and researched this issue thoroughly, until I got to the conclusion that this must be a bug in iOS (tested with 7.1, but probably occurs on 8.0 as well).

My tests and findings:

  • Occurs with every BLE supporting iDevice.
  • Occurs with both my own BLE peripheral and with other 3rd party BLE products, both known to work perfectly in normal cases.
  • It can sometimes work well for even 50 launches, but then eventually it’ll fail.
  • Network & factory settings reset did not help.
  • Tested and occurred with various applications: ##
    • My own app.
    • Clean new Xcode project that’s only scanning for peripherals and trying to connect to the first and only discovered peripheral.
    • Apple’s BLE example app: Health Thermometer (with relevant modifications since I don’t have this particular peripheral).
    • 3rd party apps, including the generic LightBlue.
    • Important note: Every one of the options above worked perfectly for a while (multiple launches), at some point suddenly stopped and then worked again after a restart of the device.
  • The connection procedure seems to fail when trying to discover the peripheral’s services - i.e. it gets discovered and connected normally, but when initiating discovery of services, it stops responding (didDiscoverServices isn't called).
  • I have of course tried many approaches found online with no luck.

Can anyone shed some light on this problem?

  • Is it a known issue?
  • Was it fixed in a recent iOS update?
  • Is it going to be fixed?

You can imagine the negative affect such an issue has on my users’ experience, as BLE connection is essential to the product.

I'll appreciate your advice and suggestions on how to solve it.

Thanks!

Update:

Apple responded to my tech support request:

Bottom line(s):

  • They said they had fixed some BLE related bugs in iOS 8 and urging us to test if it still happens in iOS 8.
  • They said to start with that and if not, try to diagnose the problem with a utility app they provide.

So far for me it didn't happen with iOS 8, but on the other hand I can see posts about other Bluetooth issues, that are not necessarily related but who knows.

Full answer:

I’m responding to your finding that you and your customers find that after some point of use, iOS BLE fails to maintain a connection. You indicate that the problem was identified with iOS 7.1. There have been issue regarding iOS BLE which have been reported and have been fixed with iOS 8.0. To best determine whether your issue has been addressed, of course the simplest means would be to install iOS 8 and to see if the issue can be replicated. However, as you report that you can replicate the problem on your deivce with iOS 7.1 the first thing would be to obtain the Bluetooth Server profile, install it to your deivce, replicate the problem, then obtain a BLE Server log when the problem occurs. The profile will have the BLE server report additional logging details which can help to report issues that the server encounters. We can see if the issue is one which has been reported previously. Something to consider is that for all new bug report issues, Core Bluetooth engineering is requesting that all issues be regressed with the currently shipping version of iOS - that is 8.0. For customers with iOS 7.x, there will be no more iOS 7 updates - all software fixes and bug fixes will be with iOS 8. For this reason, only issues which are reported with iOS 8 will be investigated. You can obtain the BLE server profile from the Apple Developer bug report web page https://developer.apple.com/bug-reporting/ios/bluetooth/. The instructions for installing the profile and capturing the log, are presented on the web page. If you capture a log with iOS 7.x, you can send it to me for review. However, this will be somewhat of an academic exercise - to know if iOS solves the issue, or whether it persists, we will need to see if the issue occurs under iOS 8. Something to keep in mind, once you update a device to iOS 8, you will not be able to restore it to a previous version. I’m happy to review your results. If however, the problem persists under iOS 8, it’s best to submit a bug report to get Core Bluetooth engineering’s attention on this matter. You can submit a bug report using the Apple Developer bug report web page. - http://bugreport.apple.com


Solution

  • So it looks like the problem is solved with recent iOS update (either 8.0 or 8.1).