iPadOS-specific Nordic DFU startup failure at 0% after `initialising`, same peripheral succeeds on another iPad

Hi,

We are investigating a Nordic BLE DFU startup failure on iPadOS and would appreciate guidance on whether this pattern is known at the CoreBluetooth / iOS DFU layer.

### Observed behavior

- Our iOS app starts DFU successfully and receives the `initialising` callback.
- The update then fails at `0%` after about 14 seconds.
- We do **not** receive any progress callback above 0%.
- We do **not** see a later reconnect/bootloader phase in this failing case.
- Right before failure, our app’s connected-device topology drops from the target peripheral to `none`.
- The same physical peripheral updates successfully on a different iPad.

### Comparison

Failing device:
- iPad 11th gen / `iPad15,7`
- iPadOS `26.4`
- App version `2.10.10`

Working device:
- iPad mini 4
- Same firmware package
- Same peripheral updates successfully

### Conditions already ruled out

- Only one BLE peripheral connected
- App kept in foreground
- Peripheral kept very close to iPad
- Rebooted iPad
- Toggled Bluetooth off/on
- Force-closed and reopened app

### Additional app-side check already performed

Our first detailed log showed metadata callbacks arriving for the target device during active DFU, and at that time our UI layer was still issuing a `setColor(...)` write to the same device.

We treated that as a possible self-interference bug, removed those color writes, shipped a new build, and captured another failing run. The second run still failed in the exact same way:

- `initialising`
- no progress above 0%
- metadata callbacks still occur, but now explicitly **skip** color restore
- device topology later becomes `none`
- failure after ~14 seconds with `maxRetryCountReached`

So at this point we believe app-side color writes are **not** the root cause.

### Failing timeline summary

Both failing runs look like:

- preflight completes normally
- DFU start requested
- `initialising(type: application)`
- no progress callback above 0%
- no later reconnect/bootloader progression surfaced by the SDK
- after ~14 seconds, topology drops to `none`
- terminal error surfaced by our layer as `FirmwareUpdateError.maxRetryCountReached`

### Raw excerpts

Run 1 (before removing metadata-triggered color writes):

```text
[2026-04-06T20:36:11.311Z] state=initialising(type: CosmoSDK.FirmwareUpdateType.application)
[2026-04-06T20:36:14.995Z] metadata arrived during active update — restoring its color only
[2026-04-06T20:36:26.084Z] state=failed(type: CosmoSDK.FirmwareUpdateType.application, error: CosmoSDK.FirmwareUpdateError.maxRetryCountReached)
```

Run 2 (after removing those color writes):

```text
[2026-04-09T01:31:12.905Z] state=initialising(type: CosmoSDK.FirmwareUpdateType.application)
[2026-04-09T01:31:16.497Z] Metadata arrived for updating device ... — skip color restore during DFU
[2026-04-09T01:31:27.557Z] state=failed(type: CosmoSDK.FirmwareUpdateType.application, error: CosmoSDK.FirmwareUpdateError.maxRetryCountReached)
```

### Question

Does this pattern match any known iPadOS / CoreBluetooth / Nordic DFU issue where:

1. DFU reaches `initialising`
2. transfer never starts beyond 0%
3. the peripheral disappears from the app topology after ~14 seconds
4. the session ends with `maxRetryCountReached`
5. the same peripheral succeeds on a different iPad

If so, are there recommended mitigations on iOS such as:

- different startup retry timing
- packet receipt notification settings
- reconnect handling adjustments
- MTU / PRN / bootloader handoff expectations
- known issues on newer iPad hardware / iPadOS releases

Thanks.
  • We have now captured the same failure pattern from a second client as well.

    This confirms it is not limited to a single peripheral. The second case shows the same behavior on the same iPad model and OS (iPad15,7 on iPadOS 26.4):

    • DFU reaches initialising
    • no progress above 0%
    • we now explicitly suppress non-DFU color writes during this phase
    • topology later drops to none
    • failure occurs after about 14s
    • surfaced error remains maxRetryCountReached

    So at this point the issue appears reproducible across multiple peripherals on iPad15,7 / iPadOS 26.4, which further suggests a device/OS-specific DFU startup issue rather than a problem with one particular unit.

  • Hello,

    Please try the same with our nRF Connect app and see if you get the same result. And if so, please post the logs from this app.

    Best regards,

    Vidar

  • Hello Vidar,

    here are the logs from the nRF Connect app:

    [15:22:04.336] Normal: Scanner On.
    [15:22:04.338] Normal: Device Scanned.
    [15:22:05.340] Normal: Appearance changed from Generic to LEDService.
    [15:22:08.041] Normal: Connected.
    [15:22:08.640] Normal: Discovered Device Information, Battery Service, Nordic LED and Button Service, 00001423-1212-EFDE-1423-785FEABCD123, and Legacy DFU Service Services.
    [15:22:08.697] Normal: Service Discovery returned nil Services.
    [15:22:08.818] Normal: Discovered Manufacturer Name String, Serial Number String, Hardware Revision String, and Firmware Revision String Characteristics for Service Device Information.
    [15:22:08.877] Normal: Service Discovery returned nil Services.
    [15:22:08.937] Normal: Discovered Battery Level Characteristics for Service Battery Service.
    [15:22:08.997] Normal: Service Discovery returned nil Services.
    [15:22:09.336] Normal: Discovered Blinky Button State, Blinky LED State, 00001526-1212-EFDE-1523-785FEABCD123, 00001527-1212-EFDE-1523-785FEABCD123, and 00001528-1212-EFDE-1523-785FEABCD123 Characteristics for Service Nordic LED and Button Service.
    [15:22:09.387] Normal: Service Discovery returned nil Services.
    [15:22:09.660] Normal: Discovered 00001424-1212-EFDE-1423-785FEABCD123, 00001425-1212-EFDE-1423-785FEABCD123, 00001427-1212-EFDE-1423-785FEABCD123, and 00001426-1212-EFDE-1423-785FEABCD123 Characteristics for Service 00001423-1212-EFDE-1423-785FEABCD123.
    [15:22:09.717] Normal: Service Discovery returned nil Services.
    [15:22:09.993] Normal: Discovered Legacy DFU Packet, Legacy DFU Control Point, and Legacy DFU Version Characteristics for Service Legacy DFU Service.
    [15:22:09.993] Normal: Manufacturer Name String has no Descriptors.
    [15:22:09.994] Normal: Serial Number String has no Descriptors.
    [15:22:09.994] Normal: Hardware Revision String has no Descriptors.
    [15:22:09.994] Normal: Firmware Revision String has no Descriptors.
    [15:22:09.994] Normal: Battery Level has no Descriptors.
    [15:22:10.049] Normal: Discovered Client Characteristic Configuration Descriptors for Characteristic Blinky Button State
    [15:22:10.108] Normal: Discovered Client Characteristic Configuration Descriptors for Characteristic Blinky LED State
    [15:22:10.170] Normal: Discovered Client Characteristic Configuration Descriptors for Characteristic 00001526-1212-EFDE-1523-785FEABCD123
    [15:22:10.229] Normal: Discovered Client Characteristic Configuration Descriptors for Characteristic 00001527-1212-EFDE-1523-785FEABCD123
    [15:22:10.229] Normal: 00001528-1212-EFDE-1523-785FEABCD123 has no Descriptors.
    [15:22:10.230] Normal: 00001424-1212-EFDE-1423-785FEABCD123 has no Descriptors.
    [15:22:10.231] Normal: 00001425-1212-EFDE-1423-785FEABCD123 has no Descriptors.
    [15:22:10.231] Normal: 00001427-1212-EFDE-1423-785FEABCD123 has no Descriptors.
    [15:22:10.232] Normal: 00001426-1212-EFDE-1423-785FEABCD123 has no Descriptors.
    [15:22:10.232] Normal: Legacy DFU Packet has no Descriptors.
    [15:22:10.288] Normal: Discovered Client Characteristic Configuration Descriptors for Characteristic Legacy DFU Control Point
    [15:22:10.353] Normal: Legacy DFU Version has no Descriptors.
    [15:23:49.828] Normal: Found valid Firmware in file:///var/mobile/Containers/Data/Application/1F68BD00-AA2E-4486-ACA6-3422EDDD0DE4/Library/Caches/firmware_4.4.00.zip for Device DFU nRF5 SDK.
    [15:23:52.229] Normal: Connecting to Cosmo...
    [15:23:52.229] Normal: Connected to Cosmo
    [15:23:52.229] Normal: Discovering services...
    [15:23:52.229] Normal: Services discovered
    [15:23:52.229] Normal: Starting Legacy DFU...
    [15:23:52.229] Normal: Connected to Cosmo
    [15:23:52.229] Normal: Services discovered
    [15:23:52.229] Normal: Legacy DFU Service found
    [15:23:52.229] Normal: Discovering characteristics in DFU Service...
    [15:23:52.229] Normal: DFU characteristics discovered
    [15:23:52.229] Normal: Reading DFU Version number...
    [15:23:52.259] Normal: Read Response received from 00001534-1212-EFDE-1523-785FEABCD123, value (0x): 0200
    [15:23:52.259] Normal: Version number read: 0.2
    [15:23:52.259] Normal: Enabling notifications for 00001531-1212-EFDE-1523-785FEABCD123...
    [15:23:52.318] Normal: Notifications enabled for 00001531-1212-EFDE-1523-785FEABCD123
    [15:23:52.318] Normal: DFU Control Point notifications enabled
    [15:23:52.318] Normal: Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    [15:23:52.318] Normal: Writing image sizes (0b, 0b, 127832b) to characteristic 00001532-1212-EFDE-1523-785FEABCD123...
    [15:23:52.378] Normal: Data written to 00001531-1212-EFDE-1523-785FEABCD123
    [15:23:52.378] Normal: Start DFU (Op Code = 1, Upload Mode = 4) request sent
    [15:23:52.449] Normal: Disconnected.
    [15:23:52.451] Normal: Disconnected by the remote device
    [15:23:52.451] Normal: Connecting to Cosmo...
    [15:23:53.884] Normal: Connected to Cosmo
    [15:23:53.884] Normal: Discovering services...
    [15:23:54.508] Normal: Services discovered
    [15:23:54.508] Normal: Legacy DFU Service found
    [15:23:54.508] Normal: Discovering characteristics in DFU Service...
    [15:23:54.748] Normal: DFU characteristics discovered
    [15:23:54.749] Normal: Reading DFU Version number...
    [15:23:54.808] Normal: Read Response received from 00001534-1212-EFDE-1523-785FEABCD123, value (0x): 0200
    [15:23:54.808] Normal: Version number read: 0.2
    [15:23:54.808] Normal: Enabling notifications for 00001531-1212-EFDE-1523-785FEABCD123...
    [15:23:54.928] Normal: Notifications enabled for 00001531-1212-EFDE-1523-785FEABCD123
    [15:23:54.928] Normal: DFU Control Point notifications enabled
    [15:23:54.928] Normal: Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    [15:23:54.928] Normal: Writing image sizes (0b, 0b, 127832b) to characteristic 00001532-1212-EFDE-1523-785FEABCD123...
    [15:23:54.988] Normal: Data written to 00001531-1212-EFDE-1523-785FEABCD123
    [15:23:54.988] Normal: Start DFU (Op Code = 1, Upload Mode = 4) request sent
    [15:23:55.057] Normal: Disconnected by the remote device
    [15:23:55.057] Normal: Connecting to Cosmo...
    [15:24:04.309] Normal: Scanner Off.
    [15:24:05.057] Warning: Connection timeout!
    [15:24:05.060] Error: [Callback] Central Manager failed to connect to peripheral (timeout)
    [15:24:05.061] Error: DFU Failed with Error: Device failed to connect

  • Hello,

    I see that this is the old legacy DFU protocol, which we deprecated around 10 years ago. Do you know which nRF5 SDK and softdevice version the target device is using? Also, are you able to determine when the target enters bootloader DFU mode?

    It would be helpful to see a log from a successful DFU for comparison. When exporting logs, please make sure to select the "VERBOSE" level first. And when posting logs, use the Insert -> code button for better formatting.

  • this is from a successful update


    [10:40:58.066] Normal: Found valid Firmware in file:///var/mobile/Containers/Data/Application/8C9482F5-0DAE-4DF2-8126-820EA3AC056C/Library/Caches/firmware_4.0.00%2027657A531-2ADD-4955-AD1A-58F7CCCF4463-76534-00002CE491581F24.zip for Device DFU nRF5 SDK.
    [10:40:59.628] Verbose: Starting DFU...
    [10:40:59.633] Verbose: Unpacking contents of Nordic DFU file...
    [10:40:59.712] Normal: Connecting to Cosmo...
    [10:40:59.712] Normal: Connected to Cosmo
    [10:40:59.712] Normal: Discovering services...
    [10:40:59.712] Normal: Services discovered
    [10:40:59.712] Normal: Starting Legacy DFU...
    [10:40:59.712] Normal: Connected to Cosmo
    [10:40:59.712] Normal: Services discovered
    [10:40:59.712] Normal: Legacy DFU Service found
    [10:40:59.712] Normal: Discovering characteristics in DFU Service...
    [10:40:59.712] Normal: DFU characteristics discovered
    [10:40:59.712] Normal: Reading DFU Version number...
    [10:40:59.731] Normal: Read Response received from 00001534-1212-EFDE-1523-785FEABCD123, value (0x): 0200
    [10:40:59.731] Normal: Version number read: 0.2
    [10:40:59.731] Normal: Enabling notifications for 00001531-1212-EFDE-1523-785FEABCD123...
    [10:40:59.789] Normal: Notifications enabled for 00001531-1212-EFDE-1523-785FEABCD123
    [10:40:59.789] Normal: DFU Control Point notifications enabled
    [10:40:59.789] Normal: Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    [10:40:59.789] Normal: Writing image sizes (0b, 0b, 127296b) to characteristic 00001532-1212-EFDE-1523-785FEABCD123...
    [10:40:59.850] Normal: Data written to 00001531-1212-EFDE-1523-785FEABCD123
    [10:40:59.850] Normal: Start DFU (Op Code = 1, Upload Mode = 4) request sent
    [10:40:59.917] Normal: Disconnected.
    [10:40:59.918] Normal: Disconnected by the remote device
    [10:40:59.918] Normal: Connecting to Cosmo...
    [10:41:00.424] Normal: Connected to Cosmo
    [10:41:00.424] Normal: Discovering services...
    [10:41:00.736] Normal: Services discovered
    [10:41:00.736] Normal: Legacy DFU Service found
    [10:41:00.736] Normal: Discovering characteristics in DFU Service...
    [10:41:00.917] Normal: DFU characteristics discovered
    [10:41:00.917] Normal: Reading DFU Version number...
    [10:41:00.961] Normal: Read Response received from 00001534-1212-EFDE-1523-785FEABCD123, value (0x): 0800
    [10:41:00.961] Normal: Version number read: 0.8
    [10:41:00.962] Normal: Enabling notifications for 00001531-1212-EFDE-1523-785FEABCD123...
    [10:41:01.051] Normal: Notifications enabled for 00001531-1212-EFDE-1523-785FEABCD123
    [10:41:01.051] Normal: DFU Control Point notifications enabled
    [10:41:01.051] Normal: Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    [10:41:01.051] Normal: Writing image sizes (0b, 0b, 127296b) to characteristic 00001532-1212-EFDE-1523-785FEABCD123...
    [10:41:01.095] Normal: Data written to 00001531-1212-EFDE-1523-785FEABCD123
    [10:41:01.095] Normal: Start DFU (Op Code = 1, Upload Mode = 4) request sent
    [10:41:12.391] Normal: Notification received from 00001531-1212-EFDE-1523-785FEABCD123, value (0x): 100101
    [10:41:12.391] Normal: Response (Op Code = Start DFU, Status = Success) received
    [10:41:12.392] Normal: Writing Initialize DFU Parameters (Op Code = 2, Type = Begin)...
    [10:41:12.392] Normal: Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    [10:41:12.392] Normal: Writing to characteristic 00001532-1212-EFDE-1523-785FEABCD123...
    [10:41:12.392] Normal: Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    [10:41:12.436] Normal: Data written to 00001531-1212-EFDE-1523-785FEABCD123
    [10:41:12.505] Normal: Data written to 00001531-1212-EFDE-1523-785FEABCD123
    [10:41:12.505] Normal: Notification received from 00001531-1212-EFDE-1523-785FEABCD123, value (0x): 100201
    [10:41:12.505] Normal: Response (Op Code = Initialize DFU Parameters, Status = Success) received
    [10:41:12.505] Normal: Initialize DFU Parameters completed
    [10:41:12.505] Normal: Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    [10:41:12.548] Normal: Data written to 00001531-1212-EFDE-1523-785FEABCD123
    [10:41:12.548] Normal: Packet Receipt Notif Req (Op Code = 8, Value = 12) request sent
    [10:41:12.548] Normal: Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    [10:41:12.595] Normal: Data written to 00001531-1212-EFDE-1523-785FEABCD123
    [10:41:12.595] Normal: Uploading firmware...
    [10:41:12.595] Normal: Sending firmware to DFU Packet characteristic...
    [10:41:49.384] Normal: Notification received from 00001531-1212-EFDE-1523-785FEABCD123, value (0x): 100301
    [10:41:49.384] Normal: Response (Op Code = Receive Firmware Image, Status = Success) received
    [10:41:49.384] Normal: Upload completed in 36.79 seconds
    [10:41:49.384] Normal: Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    [10:41:49.428] Normal: Data written to 00001531-1212-EFDE-1523-785FEABCD123
    [10:41:49.428] Normal: Validate Firmware (Op Code = 4) request sent
    [10:41:49.586] Normal: Notification received from 00001531-1212-EFDE-1523-785FEABCD123, value (0x): 100401
    [10:41:49.586] Normal: Response (Op Code = Validate Firmware, Status = Success) received
    [10:41:49.586] Normal: Writing to characteristic 00001531-1212-EFDE-1523-785FEABCD123...
    [10:41:49.629] Normal: Data written to 00001531-1212-EFDE-1523-785FEABCD123
    [10:41:49.629] Normal: Activate and Reset (Op Code = 5) request sent
    [10:41:49.687] Normal: Disconnected by the remote device

Related