AlertConfiguration.AlertSound.named plays system default despite CAF in main bundle (AlarmKit, iOS 26.5)

We need an official answer: wrong wiring, known bug on 26.5, or unsupported?

AlertConfiguration.AlertSound.default works. AlertConfiguration.AlertSound.named("lifeloop_alarm_silent") schedules successfully (Stop/Snooze UI, no API error) but playback is always system default — never our bundled CAF.

OFFICIAL API WE FOLLOW Documentation: AlertConfiguration.AlertSound.named(:) https://developer.apple.com/documentation/activitykit/alertconfiguration/alertsound/named(:)

"The name of the sound file to use for the alert. Choose a file that's in your app's main bundle or the Library/Sounds folder of your app's data container."

WWDC25 session 230 shows: let sound = AlertConfiguration.AlertSound.named("Chime") with the file in the main bundle. We use: AlertConfiguration.AlertSound.named("lifeloop_alarm_silent")

Our Swift schedules with AlarmManager.AlarmConfiguration.alarm(..., sound: alertSound).

REFERENCES WE ALREADY READ

OUR WIRING (please confirm correct or tell us what to change) We schedule fixed-time dose alarms with:

AlarmManager.AlarmConfiguration.alarm( schedule: .fixed(fireDate), attributes: attributes, stopIntent: stopIntent, secondaryIntent: snoozeIntent, sound: alertSound)

.default on this parameter works. .named("lifeloop_alarm_silent") does not — despite Bundle.main finding the file (proof below).

Question: Is sound: on .alarm(...) correct for custom AlertSound.named, or must sound go in nested AlertConfiguration(title:body:sound:) as in the overview example?

WHAT WE HEAR ON DEVICE

  • sound = .default → loud system alarm (works)
  • sound = .named("lifeloop_alarm_silent") → same loud system/default every time
  • No API error — silent fallback to default

PROOF 1 — FILE IN SHIPPED IPA $ find Payload -name "lifeloop_alarm_*.caf" Payload/LifeLoop.app/lifeloop_alarm_silent.caf

PROOF 2 — RUNTIME ON DEVICE (2026-06-30, iOS 26.5) Bundle.main.url(forResource:withExtension:): FOUND Bundle.main.url(full filename in name): FOUND Path: .../LifeLoop.app/lifeloop_alarm_silent.caf All .caf in main bundle: lifeloop_alarm_silent.caf Library/Sounds: (none) Widget .appex .caf: (none)

Native log at schedule: [alarmkit] build_config · soundModeRaw=silent alertSound=named:lifeloop_alarm_silent silentCafInBundle=true [alarmkit] schedule_ok · alarmID=FBDF2082-61F1-4C93-8B20-094A60EA8626

CAF: lifeloop_alarm_silent.caf — mono, 44100 Hz, 16-bit PCM, ~0.5 s

QUESTIONS FOR DTS

  1. Main app bundle only, or must CAF also be in widget .appex?
  2. Must named(_:) include ".caf" or base name only?
  3. Bundle.main FOUND at schedule time but playback is default — known bug on 26.5?
  4. Please answer: (A) wrong wiring + correct recipe, (B) known bug + fix version, or (C) not supported — please document.

Thank you.

Same problem as tonny00 — custom CAF never plays, always the loud system/default alarm.

App: LifeLoop (com.stujacks.lifeloop) on iOS 26.5 (physical device).

https://developer.apple.com/forums/thread/814732

Answered by Stujacks in 895830022

Resolved on iOS 26.5 — the issue was the named(_:) string, not bundling.

Broken: .named("lifeloop_alarm_silent") — Bundle.main FOUND the file, playback still system default.

Fixed: .named("lifeloop_alarm_silent.caf") — bundled CAF plays correctly.

Same wiring: AlarmConfiguration.alarm(..., sound: alertSound). WWDC’s "Chime" example (no extension) was misleading for .caf bundles on 26.5.

Accepted Answer

Resolved on iOS 26.5 — the issue was the named(_:) string, not bundling.

Broken: .named("lifeloop_alarm_silent") — Bundle.main FOUND the file, playback still system default.

Fixed: .named("lifeloop_alarm_silent.caf") — bundled CAF plays correctly.

Same wiring: AlarmConfiguration.alarm(..., sound: alertSound). WWDC’s "Chime" example (no extension) was misleading for .caf bundles on 26.5.

AlertConfiguration.AlertSound.named plays system default despite CAF in main bundle (AlarmKit, iOS 26.5)
 
 
Q