Hi everyone,
I'm developing a third-party Bluetooth audio accessory and investigating AudioAccessoryKit placement updates on iOS 26.4.
My goal is to update the accessory's wearing state (for example, .inEar / .offHead) based on BLE notifications from the accessory.
- Pair the Bluetooth accessory using AccessorySetupKit.
- Obtain the paired
ASAccessory. - Register the accessory in the host app:
try await AccessoryControlDevice.register(
accessory,
capabilities: [.audioSwitching, .placement]
)
- Attempt to retrieve the registered device:
let device = try await AccessoryControlDevice.current(for: accessory)
However, current(for:) consistently fails with:
AccessoryControlDevice.Error.invalidated
Request invalidated
The BLE communication itself appears to be successful.
The following logs show that the command was sent and the accessory returned a response:
[ASK] cmd didWrite ok 68745353-1810-4B13-83A2-C1B21B652C9B notifying=false
[ASK] cmd toSend mac=2a:e6:e7:eb:be:2c model=B172 bytes=5560014FC000000F status=connected shaking=false
[ASK] cmd write direct mac=2a:e6:e7:eb:be:2c bytes=5560014FC000000F chars=10 peripheral=2 delegate=Optional<CBPeripheralDelegate> connected=connected
[ASK] cmd reply ok uuid=CA235943-1810-45E6-8326-FC8CA3BC45CE bytes=5560014F4001000F
[ASK][PLC] Experiment 4 - inEar request delivered, op=update worn=true
[ASK][PLC] Experiment 4 - inEar current baseline:
current FAIL AccessoryControlDevice.Error.invalidated
desc=Request invalidated
The BLE command is successfully delivered to the accessory, and the accessory responds. However, the AudioAccessoryKit API still returns invalidated.
- Does
AccessoryControlDevice.current(for:)require a specific app extension context, entitlement, or authorization? - Is it expected to call
current(for:)from the host app, or must it be called from an app extension? - Does registering
.placementand.audioSwitchingin the host app guarantee that the accessory can subsequently be retrieved usingcurrent(for:)? - Are there any additional requirements for the accessory, firmware, or system-side registration before
current(for:)can succeed? - Is there a known issue with
AccessoryControlDevice.current(for:)returningError.invalidatedon iOS 26.4?
I understand that AccessoryControlDevice.update(_:) is documented as an API that must only be called from an app extension. I'm trying to determine whether the failure of current(for:) in the host app is expected behavior or indicates a registration/configuration problem.
Any sample code, implementation guidance, or clarification from Apple engineers would be greatly appreciated.
Thanks!