Sample CodeiOS, iPadOSReviewed 2026-07-21View on Apple Developer

Creating screen annotations for objects in an AR experience

At a glance

Item Summary
Purpose Annotate an AR experience with virtual sticky notes that you display onscreen over real and virtual objects.
App architecture A Swift sample with the source-visible chain AppDelegateViewControllerARKit APIs.
Main patterns View-controller organization, Protocol-oriented abstraction, Delegate or data-source callbacks
Project style 14 scanned source file(s) across Swift, organized around ranked entry, type, and file boundaries.
Execution model Source-visible boundaries: DispatchQueue.main.async; none alone proves a background thread.
State/event model Source-visible mechanisms: NotificationCenter.
Key frameworks/packages UIKit, ARKit, RealityKit, Combine, Foundation; these are source dependencies, not architecture labels.

Project structure

Source bundle/
└── ScreenSpace-Sample/
    ├── AppDelegate.swift
    └── ViewController/
        ├── Components/
        │   └── ScreenSpaceComponent.swift
        ├── ViewController.swift
        ├── Views/
        │   ├── GradientView.swift
        │   ├── StickyNoteView.swift
        │   └── MessageLabel.swift
        ├── Delegates/
        │   ├── ViewController+ARCoachingOverlayDelegate.swift
        │   └── ViewController+UITextViewDelegate.swift
        ├── Entities/
        │   └── StickyNoteEntity.swift
        ├── Gestures/
        │   └── ViewController+Gestures.swift
        └── Utilities/
            ├── Keyboard+Helpers.swift
            └── SIMD+Helpers.swift

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 6 project/configuration file(s) and 9 source declaration(s).

Overall architecture

Reference code

ScreenSpace-Sample/AppDelegate.swift:10 — architecture anchor

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool {
        guard ARWorldTrackingConfiguration.isSupported else {
            fatalError("""
                ARKit is not available on this device. For apps that require ARKit
                for core functionality, use the `arkit` key in the key in the
                `UIRequiredDeviceCapabilities` section of the Info.plist to prevent
                the app from installing. (If the app can't be installed, this error
                can't be triggered in a production scenario.)
                In apps where AR is an additive feature, use `isSupported` to
                determine whether to show UI for launching AR experiences.
            """) // For details, see https://developer.apple.com/documentation/arkit
        }

        return true
    }

}

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 ARKit.

Ownership and state

Ownership evidence

ScreenSpace-Sample/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
ScreenSpaceComponent StickyNoteView (view) stores or receives App/module collaborators
ScreenSpaceComponent Projection (projection) stores or receives App/module collaborators
Projection CGPoint (projectedPoint) owns value state Initialized by the owner; the binding is immutable

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.

Concern Source mechanism Verified placement or handoff Evidence
Queue scheduling DispatchQueue.main.async The source addresses the main dispatch queue. ScreenSpace-Sample/ViewController/ViewController.swift:101

@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.

Reference code

ScreenSpace-Sample/ViewController/ViewController.swift:101 — representative execution boundary

        DispatchQueue.main.async {
            // ...
            let alertController = UIAlertController(title: "The AR session failed.", message: errorMessage, preferredStyle: .alert)
            // ...
        }

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
State propagation NotificationCenter NotificationCenter distributes named process-local events. ScreenSpace-Sample/ViewController/ViewController.swift:52
Source import UIKit The cited file imports this module; runtime use and architectural role are not inferred. ScreenSpace-Sample/ViewController/Components/ScreenSpaceComponent.swift:9
Source import ARKit The cited file imports this module; runtime use and architectural role are not inferred. ScreenSpace-Sample/AppDelegate.swift:8
Source import RealityKit The cited file imports this module; runtime use and architectural role are not inferred. ScreenSpace-Sample/ViewController/Components/ScreenSpaceComponent.swift:8
Source import Combine The cited file imports this module; runtime use and architectural role are not inferred. ScreenSpace-Sample/ViewController/ViewController.swift:10
Source import Foundation The cited file imports this module; runtime use and architectural role are not inferred. ScreenSpace-Sample/ViewController/Utilities/SIMD+Helpers.swift:8

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

ScreenSpace-Sample/ViewController/Components/ScreenSpaceComponent.swift:11 — representative type boundary

protocol HasScreenSpaceView: Entity {
    var screenSpaceComponent: ScreenSpaceComponent { get set }
}
Type Responsibility Depends on or conforms to
AppDelegate Receives callback-driven events UIResponder, UIApplicationDelegate
HasScreenSpaceView Defines a capability or collaboration contract Entity
ScreenSpaceComponent Stores entity-component data or behavior Component
ViewController View lifecycle, callbacks, and feature coordination UIViewController, ARSessionDelegate
GradientView User-interface presentation and input forwarding UIView
StickyNoteView User-interface presentation and input forwarding UIView
Projection Represents a feature value or composable behavior Concrete collaborators/imported frameworks
StickyNoteEntity Represents feature data Entity, HasAnchoring, HasScreenSpaceView
MessageLabel Owns feature behavior and collaborator lifecycle UILabel

The source explicitly defines local protocol relationships: StickyNoteEntityHasScreenSpaceView.

Access control

Symbol Access Verified effect Likely rationale
clearPlaceholderText (ScreenSpace-Sample/ViewController/Delegates/ViewController+UITextViewDelegate.swift:56) fileprivate Use is restricted to this source file. Inference: share with same-file helpers or extensions without exposing the symbol module-wide.
focusOnStickyView (ScreenSpace-Sample/ViewController/Delegates/ViewController+UITextViewDelegate.swift:64) fileprivate Use is restricted to this source file. Inference: share with same-file helpers or extensions without exposing the symbol module-wide.
unfocusOnStickyView (ScreenSpace-Sample/ViewController/Delegates/ViewController+UITextViewDelegate.swift:70) fileprivate Use is restricted to this source file. Inference: share with same-file helpers or extensions without exposing the symbol module-wide.
insertNewSticky (ScreenSpace-Sample/ViewController/Gestures/ViewController+Gestures.swift:47) fileprivate Use is restricted to this source file. Inference: share with same-file helpers or extensions without exposing the symbol module-wide.

Reference code

ScreenSpace-Sample/ViewController/Delegates/ViewController+UITextViewDelegate.swift:56 — representative boundary

    fileprivate func clearPlaceholderText(_ stickyView: StickyNoteView, _ textView: UITextView) {
        // ...
            textView.text = ""
            textView.textColor = .white
        // ...
    }

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
Stores entity-component data or behavior ScreenSpaceComponent The source’s Component suffix makes this role explicit.
View lifecycle, callbacks, and feature coordination ViewController The source’s Controller suffix makes this role explicit.
Receives callback-driven events AppDelegate The source’s Delegate suffix makes this role explicit.
User-interface presentation and input forwarding GradientView, HasScreenSpaceView, StickyNoteView The source’s View suffix makes this role explicit.

Design patterns

Pattern Source evidence Purpose or tradeoff
View-controller organization ScreenSpace-Sample/ViewController/ViewController.swift:13 A controller is the verified coordination boundary; this is MVC-style only where a separate model is present.
Protocol-oriented abstraction ScreenSpace-Sample/ViewController/Entities/StickyNoteEntity.swift:12 A local protocol and concrete conformance create an explicit capability boundary.
Delegate or data-source callbacks ScreenSpace-Sample/AppDelegate.swift:11 Callback protocols invert event delivery back into the sample’s owner.

Naming conventions

  • Types: Component: ScreenSpaceComponent; Controller: ViewController; Delegate: AppDelegate; View: GradientView, HasScreenSpaceView, StickyNoteView.
  • Protocols: HasScreenSpaceView.
  • Methods: application, getCenterPoint, setPositionCenter, animateTo, updateScreenPosition, viewDidLoad, viewWillAppear, viewDidAppear.
  • Files: ScreenSpace-Sample/AppDelegate.swift, ScreenSpace-Sample/ViewController/Components/ScreenSpaceComponent.swift, ScreenSpace-Sample/ViewController/ViewController.swift, ScreenSpace-Sample/ViewController/Views/GradientView.swift, ScreenSpace-Sample/ViewController/Views/StickyNoteView.swift, ScreenSpace-Sample/ViewController/Entities/StickyNoteEntity.swift.

Architecture takeaways

  • AppDelegate is the main source-visible entry or composition anchor for this sample.
  • Framework work reaches UIKit, ARKit, RealityKit 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
ScreenSpace-Sample/AppDelegate.swift Cited implementation, ARKit, AppDelegate
ScreenSpace-Sample/ViewController/Components/ScreenSpaceComponent.swift HasScreenSpaceView, UIKit, RealityKit, ScreenSpaceComponent, Projection
ScreenSpace-Sample/ViewController/Delegates/ViewController+UITextViewDelegate.swift Cited implementation, Feature implementation
ScreenSpace-Sample/ViewController/Gestures/ViewController+Gestures.swift Cited implementation, Feature implementation
ScreenSpace-Sample/ViewController/ViewController.swift ViewController, DispatchQueue.main.async, NotificationCenter, Combine
ScreenSpace-Sample/ViewController/Entities/StickyNoteEntity.swift Cited implementation, StickyNoteEntity
ScreenSpace-Sample/ViewController/Utilities/SIMD+Helpers.swift Foundation, Feature implementation
ScreenSpace-Sample/ViewController/Views/GradientView.swift GradientView
ScreenSpace-Sample/ViewController/Views/StickyNoteView.swift StickyNoteView
ScreenSpace-Sample/ViewController/Delegates/ViewController+ARCoachingOverlayDelegate.swift Feature implementation
ScreenSpace-Sample/ViewController/Views/MessageLabel.swift MessageLabel
ScreenSpace-Sample/ViewController/Utilities/Keyboard+Helpers.swift Feature implementation
ScreenSpace-Sample/ViewController/Utilities/UIView+Helpers.swift Feature implementation
ScreenSpace-Sample/ViewController/Views/ViewController+OverlayUI.swift Feature implementation