You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Title: Oura Ring (Gen 3) not found during BLE scan (v0.9.29+) #372
Trying to pair an Oura Ring via Settings → Add a sensor → Oura Ring → Search for sensors. The ring never appears in the scan results.
Ring details:
Oura Ring Gen 3, purchased second-hand
Factory reset performed — confirmed: still discoverable and pairable via the official Oura app, but no account was created (pairing flow aborted before login)
Never paired to this iPhone at any point
As expected, it does not appear in iOS Settings → Bluetooth (BLE-only device, no classic pairing)
Steps to reproduce:
Ring factory reset, confirmed discoverable via official Oura app (setup not completed / no account created)
Open Edge → Add a sensor → Oura Ring → Search for sensors
Scan runs, ring never appears
Tried so far:
Ring on charger during scan
Ring off charger, scanning within a few seconds of removal
Confirmed battery is not critically low
Environment:
Edge version: 0.9.28 (build 60), via TestFlight
Platform: iOS
Ring generation: Gen 3
I think I've found the cause, at least on iOS 18+. Same symptom here: iPhone, nothing paired in Edge yet, the Oura app and the other ring app killed with their Bluetooth permission switched off, and the ring never appears in the sensor search. The WHOOP search, on the other hand, does find a strap.
Edge has no Bluetooth permission at all. Settings → Apps → Edge has no Bluetooth row (screenshot attached), so iOS never granted Edge normal CoreBluetooth access. Edge declares NSAccessorySetupKitSupports = Bluetooth in ios/Runner/Info.plist. As far as I can tell from third-party AccessorySetupKit write-ups and an Apple developer-forum report, an app in that mode doesn't get the standard Bluetooth prompt, and a CoreBluetooth scan or connect only reaches accessories the user approved through the ASK picker.
That explains the split:
WHOOP pairing works because it goes through AccessorySetup.showPicker().
Every notify-class sensor goes through HrsLink.scanFor / scanForAny. That is a plain FlutterBluePlus.startScan(withServices: …), and it only ever sees ASK-approved peripherals. The Oura service 98ED0001-A541-11E4-B6A0-0002A5D5C51B is not in NSAccessorySetupBluetoothServices, so the ring can't be approved anywhere, and the search returns an empty list with no error.
tool/gen_ios_ask_plist.dart states the assumption that breaks here: "A notify-only sensor is connected straight from its stored remote id during a workout and needs no ASK descriptor." That only holds for an app that also has global Bluetooth authorization, and this one doesn't. If that's right, it affects every non-WHOOP sensor on iOS 18+ (chest straps, Polar, the rings), not just Oura.
PR #484's systemDevices (retrieveConnectedPeripherals) is limited the same way, so I don't think it fixes this case on its own.
Possible direction, untested:
Declare the sensor services in the ASK block. The generator currently takes kFramedBands only.
Let showPicker take a per-call service filter, so the WHOOP picker doesn't start showing rings and straps. The existing gen4 retry also assumes items[0] is the WHOOP 4.0 item.
On iOS 18+, pair sensors through the picker, then use the returned bluetoothIdentifier as remoteId for the existing connect path, e.g. pairOuraRing(BluetoothDevice.fromId(id)).
Two unknowns:
The "CBManager is active with global permissions" ordering constraint that _provisionAdditionalAccessory already works around. A sensor search that already ran in the same process probably blocks the picker until the next launch.
Whether the ASK picker matches the ring's 128-bit service. Another app does find this ring with the same withServices filter, but that doesn't prove the service is in the primary advertisement rather than the scan response.
Activity
pipiche38 commentedon Oct 3, 2026
having the same issue
pipiche38 commentedon Oct 3, 2026
I think I've found the cause, at least on iOS 18+. Same symptom here: iPhone, nothing paired in Edge yet, the Oura app and the other ring app killed with their Bluetooth permission switched off, and the ring never appears in the sensor search. The WHOOP search, on the other hand, does find a strap.
Edge has no Bluetooth permission at all. Settings → Apps → Edge has no Bluetooth row (screenshot attached), so iOS never granted Edge normal CoreBluetooth access. Edge declares
NSAccessorySetupKitSupports= Bluetooth inios/Runner/Info.plist. As far as I can tell from third-party AccessorySetupKit write-ups and an Apple developer-forum report, an app in that mode doesn't get the standard Bluetooth prompt, and a CoreBluetooth scan or connect only reaches accessories the user approved through the ASK picker.That explains the split:
AccessorySetup.showPicker().HrsLink.scanFor/scanForAny. That is a plainFlutterBluePlus.startScan(withServices: …), and it only ever sees ASK-approved peripherals. The Oura service98ED0001-A541-11E4-B6A0-0002A5D5C51Bis not inNSAccessorySetupBluetoothServices, so the ring can't be approved anywhere, and the search returns an empty list with no error.tool/gen_ios_ask_plist.dartstates the assumption that breaks here: "A notify-only sensor is connected straight from its stored remote id during a workout and needs no ASK descriptor." That only holds for an app that also has global Bluetooth authorization, and this one doesn't. If that's right, it affects every non-WHOOP sensor on iOS 18+ (chest straps, Polar, the rings), not just Oura.PR #484's
systemDevices(retrieveConnectedPeripherals) is limited the same way, so I don't think it fixes this case on its own.Possible direction, untested:
kFramedBandsonly.showPickertake a per-call service filter, so the WHOOP picker doesn't start showing rings and straps. The existing gen4 retry also assumesitems[0]is the WHOOP 4.0 item.bluetoothIdentifierasremoteIdfor the existing connect path, e.g.pairOuraRing(BluetoothDevice.fromId(id)).Two unknowns:
_provisionAdditionalAccessoryalready works around. A sensor search that already ran in the same process probably blocks the picker until the next launch.withServicesfilter, but that doesn't prove the service is in the primary advertisement rather than the scan response.Happy to test a build on my iPhone and ring.
oura: say which pairing ran, and probe the ring before connecting
ios: pair the oura ring through its own accessorysetupkit picker