Playing video content in a standard user interface
At a glance
| Item | Summary |
|---|---|
| Purpose | Play media full screen, embedded inline, or in a floating Picture in Picture (PiP) window using a player view controller. |
| App architecture | A Swift sample with the source-visible chain AppDelegate → PlaybackController → PlayerViewControllerCoordinator → AVKit APIs. |
| Main patterns | View-controller organization, Protocol-oriented abstraction, Delegate or data-source callbacks, Coordinator |
| Project style | 9 scanned source file(s) across Swift, organized around ranked entry, type, and file boundaries. |
| Execution model | No structured execution marker indexed; callback threading requires source review. |
| State/event model | No structured observation or publisher-scheduling marker indexed. |
| Key frameworks/packages | UIKit, AVKit, AVFoundation; these are source dependencies, not architecture labels. |
Project structure
Source bundle/
├── Using AVKit in iOS/
│ ├── AppDelegate.swift
│ ├── PlayerViewControllerCoordinator.swift
│ ├── PlaybackController.swift
│ ├── VideoBrowserViewController.swift
│ ├── ViewController.swift
│ ├── VideoBrowserCell.swift
│ ├── DebugHUD.swift
│ ├── Video.swift
│ └── VideoBrowserFlowLayout.swift
├── Configuration/
│ └── SampleCode.xcconfig
└── Using AVKit in iOS.xcodeproj/
├── .xcodesamplecode.plist
└── project.pbxproj
Structure observations
- Architecturally prominent files are ranked from entry points and role-named declarations; resource-only paths are omitted.
- Primary languages: Swift.
- The verified tree contains 7 project/configuration file(s) and 12 source declaration(s).
Overall architecture
flowchart LR
N1["AppDelegate"]
N2["PlaybackController"]
N3["PlayerViewControllerCoordinator"]
N4["AVKit APIs"]
N1 --> N2
N2 --> N3
N3 --> N4
Reference code
Using AVKit in iOS/AppDelegate.swift:10 — architecture anchor
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
}Interpretation
The arrows summarize the source-visible entry, role-named types or folders, and framework direction; when nodes come from structural folders, the sequence is a high-level interpretation rather than proof that every adjacent node calls the next. Ownership is claimed only where the next section cites a stored property or assignment. The diagram is intentionally limited to the dominant path into AVKit.
Ownership and state
classDiagram
AppDelegate o-- UIWindow : window
PlayerViewControllerCoordinator o-- Video : video
PlayerViewControllerCoordinator o-- PlayerViewControllerCoordinatorDelegate : delegate
PlayerViewControllerCoordinator o-- Status : status
Ownership evidence
Using AVKit in iOS/AppDelegate.swift:13 — stored dependency or nearest verified ownership anchor
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
}| Owner | Object or state | Relationship | Mutation authority |
|---|---|---|---|
AppDelegate |
UIWindow (window) |
stores or receives | App/module collaborators |
PlayerViewControllerCoordinator |
Video (video) |
stores or receives | App/module collaborators |
PlayerViewControllerCoordinator |
PlayerViewControllerCoordinatorDelegate (delegate) |
holds a non-owning reference | The referenced object’s lifecycle is owned elsewhere |
PlayerViewControllerCoordinator |
Status (status) |
stores or receives | Owning type writes; wider scope can read |
Composition arrows indicate a source-visible construction expression or locally owned value state; aggregation means the owner stores or receives a dependency without proving exclusive lifetime ownership.
Concurrency, scheduling, and thread safety
Evidence limit: actor isolation, async/await, or Task creation does not by itself prove background-thread execution; Sendable conformance alone does not prove thread-safe mutation.
No source-visible execution, scheduling, or synchronization boundary was found in the indexed source.
@MainActor/MainActor.run, DispatchQueue.main, and RunLoop.main are reported as distinct isolation, queue, and event-loop mechanisms. A plain Task is kept separate from Task.detached; neither is labeled as a background thread.
State propagation, frameworks, and dependencies
Evidence limit: an import proves a source-level compilation dependency at the cited line; it does not prove runtime use, architectural adoption, or whether a Swift package is a direct application dependency.
| Category | Mechanism or module | Verified role | Evidence |
|---|---|---|---|
| Source import | UIKit |
The cited file imports this module; runtime use and architectural role are not inferred. | Using AVKit in iOS/AppDelegate.swift:8 |
| Source import | AVKit |
The cited file imports this module; runtime use and architectural role are not inferred. | Using AVKit in iOS/PlayerViewControllerCoordinator.swift:9 |
| Source import | AVFoundation |
The cited file imports this module; runtime use and architectural role are not inferred. | Using AVKit in iOS/PlaybackController.swift:9 |
receive(on:) describes downstream delivery scheduling, while subscribe(on:) describes upstream subscription/request/cancel scheduling. An import Combine alone establishes neither behavior nor a Store, reducer, Redux, or other application architecture.
Class and protocol design
Using AVKit in iOS/PlayerViewControllerCoordinator.swift:310 — representative type boundary
protocol PlayerViewControllerCoordinatorDelegate: AnyObject {
// ...
_ coordinator: PlayerViewControllerCoordinator,
restoreUIForPIPStop completion: @escaping (Bool) -> Void
// ...
}| Type | Responsibility | Depends on or conforms to |
|---|---|---|
AppDelegate |
Receives callback-driven events | UIResponder, UIApplicationDelegate |
PlayerViewControllerCoordinatorDelegate |
Defines a capability or collaboration contract | AnyObject |
VideoBrowserCellDelegate |
Defines a capability or collaboration contract | AnyObject |
PlayerViewControllerCoordinator |
Cross-object flow or session coordination | NSObject |
PlaybackController |
View lifecycle, callbacks, and feature coordination | Concrete collaborators/imported frameworks |
VideoBrowserViewController |
View lifecycle, callbacks, and feature coordination | UICollectionViewController |
ViewController |
View lifecycle, callbacks, and feature coordination | UITableViewController |
Status |
Represents a feature value or composable behavior | OptionSet, CustomDebugStringConvertible |
VideoBrowserCell |
Owns feature behavior and collaborator lifecycle | UICollectionViewCell |
DebugHUD |
Owns feature behavior and collaborator lifecycle | UIView |
The source explicitly defines local protocol relationships: VideoBrowserViewController → VideoBrowserCellDelegate, ViewController → PlayerViewControllerCoordinatorDelegate.
Access control
| Symbol | Access | Verified effect | Likely rationale |
|---|---|---|---|
label (Using AVKit in iOS/DebugHUD.swift:19) |
private |
Use is restricted to the lexical declaration and same-file extensions allowed by Swift. | Inference: keep state mutation or dependency lifetime inside the owning implementation. |
playbackItems (Using AVKit in iOS/PlaybackController.swift:15) |
private |
Use is restricted to the lexical declaration and same-file extensions allowed by Swift. | Inference: keep state mutation or dependency lifetime inside the owning implementation. |
coordinatorOrNil (Using AVKit in iOS/PlaybackController.swift:25) |
private |
Use is restricted to the lexical declaration and same-file extensions allowed by Swift. | Inference: hide an implementation step that is not part of the collaboration surface. |
status (Using AVKit in iOS/PlayerViewControllerCoordinator.swift:29) |
private(set) |
Read access follows the declaration; writes remain in the private scope. | Inference: allow observation while reserving invariant-changing writes for the owner. |
Reference code
Using AVKit in iOS/DebugHUD.swift:19 — representative boundary
private lazy var label: UILabel = {
let label = UILabel()
// ...
}()Swift declarations without a modifier are internal; explicit private, fileprivate, private(set), public, or open entries above are interpreted by language semantics. Objective-C/C samples instead rely on header and implementation boundaries, which are not equivalent to Swift lexical privacy.
Logic ownership and placement
| Logic | Owning type or file | Placement rationale |
|---|---|---|
| View lifecycle, callbacks, and feature coordination | PlaybackController, VideoBrowserViewController, ViewController |
The source’s Controller suffix makes this role explicit. |
| Cross-object flow or session coordination | PlayerViewControllerCoordinator |
The source’s Coordinator suffix makes this role explicit. |
| Receives callback-driven events | AppDelegate, PlayerViewControllerCoordinatorDelegate, VideoBrowserCellDelegate |
The source’s Delegate suffix makes this role explicit. |
Design patterns
| Pattern | Source evidence | Purpose or tradeoff |
|---|---|---|
| View-controller organization | Using AVKit in iOS/PlaybackController.swift:11 |
A controller is the verified coordination boundary; this is MVC-style only where a separate model is present. |
| Protocol-oriented abstraction | Using AVKit in iOS/VideoBrowserViewController.swift:48 |
A local protocol and concrete conformance create an explicit capability boundary. |
| Delegate or data-source callbacks | Using AVKit in iOS/AppDelegate.swift:11 |
Callback protocols invert event delivery back into the sample’s owner. |
| Coordinator | Using AVKit in iOS/PlayerViewControllerCoordinator.swift:11 |
A role-named coordinator centralizes cross-object flow. |
Main application flow
sequenceDiagram
actor User
participant Browser as Video browser
participant Playback as PlaybackController
participant Coord as Coordinator
participant AVKit as AVPlayerViewController
User->>Browser: Select video
Browser->>Playback: present or embed index path
Playback->>Playback: find or create coordinator
Playback->>Coord: presentFullScreen or embedInline
Coord->>AVKit: lazily create and attach player
AVKit-->>Coord: delegate lifecycle events
Coord-->>Browser: status-visible playback UI
Reference code
Using AVKit in iOS/PlaybackController.swift:49 — embed
func embed(contentForIndexPath indexPath: IndexPath, in parentViewController: UIViewController, containerView: UIView) {
coordinator(for: indexPath).embedInline(in: parentViewController, container: containerView)
}Naming conventions
- Types: Controller: PlaybackController, VideoBrowserViewController, ViewController; Coordinator: PlayerViewControllerCoordinator; Delegate: AppDelegate, PlayerViewControllerCoordinatorDelegate, VideoBrowserCellDelegate.
- Protocols:
PlayerViewControllerCoordinatorDelegate,VideoBrowserCellDelegate. - Methods:
presentFullScreen,embedInline,restoreFullScreen,dismiss,removeFromParentIfNeeded,playerViewControllerWillStartPictureInPicture,playerViewController,playerViewControllerDidStopPictureInPicture. - Files:
Using AVKit in iOS/AppDelegate.swift,Using AVKit in iOS/PlayerViewControllerCoordinator.swift,Using AVKit in iOS/PlaybackController.swift,Using AVKit in iOS/VideoBrowserViewController.swift,Using AVKit in iOS/ViewController.swift,Using AVKit in iOS/VideoBrowserCell.swift.
Architecture takeaways
AppDelegateis the main source-visible entry or composition anchor for this sample.- Framework work reaches UIKit, AVKit, AVFoundation through a deliberately small high-level chain; the detailed API graph remains inside the cited implementation files.
- Stored-property evidence identifies lifecycle collaboration; it does not by itself prove exclusive object ownership.
- Access-control conclusions separate verified language visibility from the likely design rationale.
- Local protocol relationships provide an explicit substitution boundary.
Source map
| Source file | Relevant symbols |
|---|---|
Using AVKit in iOS/AppDelegate.swift |
Cited implementation, UIKit, AppDelegate |
Using AVKit in iOS/PlayerViewControllerCoordinator.swift |
PlayerViewControllerCoordinatorDelegate, Cited implementation, PlayerViewControllerCoordinator, AVKit, Status |
Using AVKit in iOS/DebugHUD.swift |
Cited implementation, DebugHUD |
Using AVKit in iOS/PlaybackController.swift |
Cited implementation, PlaybackController, AVFoundation |
Using AVKit in iOS/VideoBrowserViewController.swift |
Cited implementation, VideoBrowserViewController |
Using AVKit in iOS/ViewController.swift |
ViewController |
Using AVKit in iOS/VideoBrowserCell.swift |
VideoBrowserCellDelegate, VideoBrowserCell |
Using AVKit in iOS/Video.swift |
Video |
Using AVKit in iOS/VideoBrowserFlowLayout.swift |
VideoBrowserFlowLayout |