Request for Suggestions to Improve BLE Throughput on iOS Devices

Hi Team,

We recently conducted a BLE throughput test by sending 2MB of data from the peripheral to the central on both Android and iOS devices. We observed significantly lower throughput on iOS compared to Android. We would appreciate any suggestions or best practices to improve BLE throughput on iOS.

Observations and Potential Bottlenecks:

  • Number of Packets per Connection Event: On all iPhone models tested, the average number of packets per connection event is only 5, regardless of the device model. Is this a limitation of iOS? Can this be adjusted at the application level?

  • Connection Interval Configuration: Our peripheral requests a lower connection interval (7.5ms) using the "Connection Parameter Update Request" packet, but iOS does not honor it.

Is there a way to configure or request a specific connection interval on iOS? What factors influence iOS’s decision to accept or reject the requested connection interval?

Here are our stats done on different phones:

Notes:

  • Throughput Formula: Throughput = (1000ms * number of packets * packet size) / Connection interval (ms)
  • Both Central and Peripheral support BLE version 5.X.
  • Low power mode on iOS is disabled.
  • The application was in the foreground during the test on iOS.
  • Packet size after headers: 242 bytes.

Are there other factors or iOS configurations that might impact BLE throughput?

We would appreciate any insights or recommendations to improve throughput on iOS devices.

You seem to be doing a lot of the things that will generally improve throughput. So, I will just touch some of the points that might be relevant for additional performance boost.

For starters, all connection parameters must be negotiated by the connecting accessory. there is nothing you can do in an app that will change those.

And as for the accessory negotiating these parameters, there are some certain rules it has to follow, otherwise the request can be rejected, and iOS will set the parameters to defaults.

These rules are explained in detail in the Accessory Design Guidelines for Apple Devices but here is a summary:

Connection parameter requests may be rejected if they do not meet the guidelines in this section.

General connection parameter request guidelines:

  • Peripheral Latency ≤ 30 connection intervals.
  • Supervision Timeout from 6 seconds to 18 seconds.
  • Interval Min ≥ 15 ms.
  • Interval Min ≤ 2 seconds.
  • Interval Min is a multiple of 15 ms.

-- One of the following:

  • Interval Max at least 15 ms greater than Interval Min.
  • Interval Max and Interval Min are both 15 ms.
  • Interval Max * (Peripheral Latency + 1) of 6 seconds or less.
  • Supervision Timeout greater than Interval Max * (Peripheral Latency + 1) * 3.

As you can see, you cannot make a request of 7.5 ms and it will be rejected. Hence the rest of the connection parameters are probably getting set to defaults. What you would want to do is to make sure the request meets the guidelines to be accepted. You can try 15ms, but is that really the best? I'll discuss more below.

Note: even with the correct parameter requests, the iOS device may still not be able to accept the parameters if the current device conditions do not allow them. Based on device state and what else might be going on with the device at that time

That said, a faster CI may not always result in a higher throughput. What you are trying to accomplish is sending as many packets as you can in a connection interval. And the optimum throughput will be a balance between the interval duration and the number of packets that can be transferred in one interval. You may want to test the best outcome for your use case with different CI values to see if being able to squeeze more packets will be more beneficial than a short interval.

So, for the best throughput you would want to do the following:

  • Write Without Response, which you are obviously doing
  • Larger MTU, which I also see in your table
  • Extended Data Length - which would be 251, which you mark as the MTU in your table. If you are not actually using EDL, do look into it
  • 15ms Interval, which you should try to see if you can fit as many packets in an interval
  • LE 2Mbps, which you are also already using

The only thing I don't see a mention of, and which is something you can actually implement in your app is L2CAP

If you are not using L2CAP, I suggest you should look into that, as it will dramatically increase your throughput by reducing GATT protocol overhead.

Hope this helps.


Argun Tekant /  DTS Engineer / Core Technologies

I’ve been running similar tests and encountered a device-specific limitation that may be relevant to this discussion. On an iPad (A16) (model MD3Y4X/A, released March 2025, iOS 18.4.1), when acting as the Central, the throughput is significantly lower than on other iOS devices. It appears to process only a single packet per connection event, which limits throughput to around 8 kB/s.

In contrast, all other iOS devices tested support multiple packets per connection interval and achieve much higher throughput.

I’d be interested to know if anyone else has observed similar limitations or unexpected behavior specific to the iPad A16. Hopefully this is something Apple will address in a future update, as the current behavior imposes a significant constraint on applications or BLE accessories that rely on higher throughput that has been supported on iOS devices since around 2017.

I encountered the same issue. On iPadOS 17 and earlier systems, data packets could be sent multiple times within a single connection interval, but on iPadOS, they could only be sent once. Using a packet capture tool, I discovered that within a connection interval, iPadOS sends a packet of data with the "More Data" attribute set to True, while iPadOS sends it with the attribute set to False. As shown in the figure, multiple transmissions can occur within a very short time interval. In iPadOS 18, only one transmission is allowed with an interval of 30ms Has your problem been solved? I would like to know if this issue is due to some restrictions imposed by iPadOS 18 or if there is a problem with our program configuration. I am looking forward to your reply

I encountered the same issue. On iPadOS 17 and earlier systems, data packets could be sent multiple times within a single connection interval, but on iPadOS 18, they could only be sent once. Using a packet capture tool, I found that within a connection interval, iPadOS 17 sends a packet of data with the "More Data" attribute set to True, whereas iPadOS 18 sends it with the attribute set to False. As shown in the figure, multiple transmissions can occur within a very short time interval, whereas in iPadOS 18, only one transmission is allowed with an interval of 30ms Has your problem been solved? I would like to know if this issue is due to some restrictions imposed by iPadOS 18 or if there is a problem with our program configuration. I am looking forward to your reply

Request for Suggestions to Improve BLE Throughput on iOS Devices
 
 
Q