swift – Core Bluetooth: Reduced BLE MTU size when upgrading from iOS 15 to iOS 16


I’m seeing an issue where the iPhone’s/iOS’s MTU size seems to decrease after upgrading from iOS 15 to iOS 16. Before upgrading to iOS 16, the MTU size from the phone’s size was always 185 bytes, which matches what most links claim the maximum MTU for the iPhone is (example 1, example 2, and example 3).

However, after upgrading to iOS 16, the MTU sent by the iPhone decreases to 77 bytes. This is using the same phone and the exact same code for the iOS app. I am connecting to a wearable device (i.e. the iPhone is the central device and the wearable is the peripheral) that contains an nRF52 chipset and always sends an MTU request of 247 bytes.

I managed to capture sniffer logs showing the iPhone replying with an MTU of 185 when using iOS 15 (which is expected):-

enter image description here

And the sniffer log below shows how the iPhone sends a reduced MTU of 77 bytes when using iOS 16:-

enter image description here

One thing worth noting is that restarting the phone seems to temporarily fix the problem, and the MTU response from the iPhone reverts back to 185 bytes, but after a few connections the iPhone starts sending 77 bytes again. Restarting Bluetooth on the iPhone does not fix the problem, and the only way to temporarily fix this is to restart the phone.

We’ve managed to consistently recreate the problem on an iPhone 11, iPhone 13 Pro Max, and iPhone 14. The issue was recreated using iOS 16 and iOS 16.0.2.

Given that there’s no CoreBluetooth API to modify the MTU size, this seems to be purely an iOS 16 bug, am I correct? Is there a way that we can overcome this and force the phone to revert to using the maximum MTU of 185 bytes?