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
- AlarmConfiguration overview: https://developer.apple.com/documentation/alarmkit/alarmmanager/alarmconfiguration
- Albert Pascual DTS reply (Feb 2026) on this thread pointed at nested alertConfiguration with sound
- AlarmKit FAQ: https://developer.apple.com/forums/thread/797158
- Older forum reply (~2025): claimed .named("Glass Drum.caf") worked — not verified on 26.5 today
- On iOS 26.5: Bundle.main finds our file with AND without ".caf" in the lookup string; playback still system default
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
- Main app bundle only, or must CAF also be in widget .appex?
- Must named(_:) include ".caf" or base name only?
- Bundle.main FOUND at schedule time but playback is default — known bug on 26.5?
- 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).
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.