Source#
Apple Developer Forums: https://developer.apple.com/forums/thread/838683
Problem#
A video-streaming app reports an iOS 27 beta behavior change: fully opening Notification Center pauses an AVQueuePlayer; audio continues for roughly five seconds, the app is then suspended, and closing Notification Center leaves playback paused. The same build reportedly continues playing on iOS 26.
Setup reported by the developer:
AVQueuePlayer
video + audio, not muted
audiovisualBackgroundPlaybackPolicy = .automatic
AVAudioSession category = .playback
UIBackgroundModes includes audio
AVPictureInPictureController attached
canStartPictureInPictureAutomaticallyFromInline = true
Feedback: FB23893965.
Evidence level#
Observed Apple Developer Forums report; platform regression remains unconfirmed.
Apple documents that AVPlayer.audiovisualBackgroundPlaybackPolicy controls audiovisual playback as an app transitions to the background. For .automatic, the system decides whether playback continues. .continuesIfPossible explicitly requests continuation; .pauses explicitly requests pause. Therefore the first task is to determine whether Notification Center causes a background/scene transition, a playback-policy transition, a PiP transition, or an independent transport pause.
Why this is a useful debugging case#
Do not collapse these states:
Notification Center becomes visible
≠
scene becomes inactive
≠
app enters background
≠
PiP starts
≠
AVPlayer transport pauses
≠
process is suspended
The approximately five-second gap between video pause and process suspension is especially useful: it suggests at least two observable transitions that should be timestamped separately rather than treated as one event.
Investigation#
Build a timestamped state timeline around Notification Center presentation.
Capture:
UIApplication / UIScene lifecycle state
AVPlayer.rate
AVPlayer.timeControlStatus
AVPlayer.rateDidChangeNotification + reason when available
AVPlayerItem.status
AVAudioSession interruption/route notifications
PiP possible / active / suspended state
AVPlayer audiovisualBackgroundPlaybackPolicy
currentTime progression
process suspension boundary from system logs
Instrument at minimum:
T0 before Notification Center pull-down
T1 Notification Center partially visible
T2 Notification Center fully presented
T3 video stops advancing
T4 audio stops
T5 scene/app lifecycle transition
T6 process suspension
T7 Notification Center dismissed
The key question is not simply “why did AVPlayer pause?” but:
Which state transition occurs immediately before
rate/timeControlStatuschanges, and which component owns that transition?
Controlled matrix#
Use the same asset and build while changing one variable at a time:
A. iOS 26 + .automatic
B. iOS 27 beta + .automatic
C. iOS 27 beta + .continuesIfPossible
D. iOS 27 beta + .pauses (control)
E. iOS 27 beta without AVPictureInPictureController
F. iOS 27 beta with PiP controller, automatic-from-inline disabled
G. audio-only AVPlayer
H. video + muted audio
I. local MP4
J. HLS
Interpretation examples:
B fails, C works
→ automatic background-policy decision is a strong boundary
B and C both fail
→ investigate lifecycle / suspension / transport policy below the public policy preference
B fails only with PiP controller attached
→ PiP eligibility/state coordination becomes primary
local + HLS both fail identically
→ HLS/network path is unlikely to be causal
audio-only continues while audiovisual pauses
→ audiovisual visibility/background policy is implicated
Public API contract to preserve#
AVPlayerAudiovisualBackgroundPlaybackPolicy is a policy input, not proof of the actual lifecycle event that triggered the player state change.
In particular:
.automatic
→ system chooses
.continuesIfPossible
→ explicit continuation preference
.pauses
→ explicit pause preference
Do not label .continuesIfPossible a production fix until it is tested against expected lifecycle, PiP, audio-session, and App Store behavior. Use it first as an A/B discriminator.
Reusable engineering rule#
For system-UI playback regressions, correlate player transport state with app/scene lifecycle and PiP state before blaming the media pipeline.
Use this boundary model:
system UI event
→ scene/application policy transition
→ audiovisual background policy
→ PiP coordination
→ AVPlayer transport decision
→ timebase progression
→ process suspension
The first transition that differs between the working OS and failing OS is the useful root-cause boundary.
References#
- Apple Developer Forums: https://developer.apple.com/forums/thread/838683
AVPlayer.audiovisualBackgroundPlaybackPolicy: https://developer.apple.com/documentation/avfoundation/avplayer/audiovisualbackgroundplaybackpolicyAVPlayerAudiovisualBackgroundPlaybackPolicy: https://developer.apple.com/documentation/avfoundation/avplayeraudiovisualbackgroundplaybackpolicyAVPictureInPictureController: https://developer.apple.com/documentation/avkit/avpictureinpicturecontroller