As the iOS documentation states, when an iOS application that utilizes BLE as a peripheral moves to background mode, the local name is not advertised and all service UUIDs are placed in the overflow area. The documentation states that they can only be discovered by an iOS device.
My overall question is how exactly this happens on a lower level. Using a non-iOS bluetooth packet sniffer, I examined the advertisement data structure from my iOS peripheral app when it was in foreground and in background modes. The advertisement data structure in foreground mode looks to be what was expected, similar to other advertisement data from non-iOS devices, such as those I have coming from an Android device.
When the iOS app is background mode, this structure changes and the service UUID is not apparent. I do not see anything suggesting an “overflow” area.
How does a iOS central device discover a peripheral device that is in background mode if the UUID is not a part of the advertising data packet?
CBCentralManagerScanOptionSolicitedServiceUUIDsKey
that you specify as an option forscanForPeripheralsWithServices:options
mentioned in the docs, and wondered if that's how you pass in the service UUIDs for discovering peripherals in that mode. – Marcus Adams