This article covers all aspects of tvOS development, from focus navigation to tvOS App Store Review. We specialize in Apple TV app development. A client came to us with an iOS streaming app: they just wanted to compile it for tvOS. Within an hour of testing on Apple TV, we found that focus navigation didn't work, buttons weren't clickable, the remote didn't respond. The App Store Review rejected the build due to missing parallax effects. A typical scenario: port iOS to tvOS without adaptation is a waste of time. Over 85% of projects that come to us have focus-navigation issues, and only 2 out of 10 iOS apps port successfully without rework. Our team averages 5-6 tvOS projects per year, each ranging from $6,000 to $24,000.
How Focus Navigation tvOS Works
On tvOS, focus navigation tvOS is the primary means of interaction. Users swipe on the remote, and the system moves focus between focusable elements. Focusable items include UIButton, UITextField, and custom UIView with canBecomeFocused = true. Problems start with custom UI: if you don't implement UIFocusEnvironment, focus simply won't reach your elements. SwiftUI tvOS works better — the focusable() modifier and @FocusState manage navigation out of the box. However, LazyVGrid requires explicit focusSection(), otherwise focus jumps unpredictably. According to Apple Human Interface Guidelines, "focus navigation is the primary means of interaction on tvOS".
Parallax effect is a mandatory visual indicator of focus. Users are accustomed to it. Implemented via UIImageView with adjustsImageWhenAncestorFocused = true and layered LSR/LCR format. For SwiftUI, use CardButtonStyle. In our projects, we use a combined approach: SwiftUI for simple screens, UIKit for complex ones. For example, for one VOD client, we implemented a custom overlay based on AVPlayerViewController wrapped via UIViewControllerRepresentable — this preserved the flexibility of real-time content rendering.
Why SwiftUI tvOS Is Better Than UIKit tvOS
SwiftUI tvOS accelerates development of simple screens by 2x but has limitations. Here's a comparison:
| Feature | UIKit tvOS | SwiftUI tvOS |
|---|---|---|
| Focus navigation | UIFocusEnvironment, canBecomeFocused |
focusable(), @FocusState |
| Parallax effect | adjustsImageWhenAncestorFocused |
CardButtonStyle (iOS 13+) |
| Video player with custom overlay | AVPlayerViewController + delegate |
Not supported — need UIViewControllerRepresentable |
| Top Shelf Extension | TVTopShelfContentProvider (UIKit only) |
No API |
For new projects, we recommend SwiftUI with selective UIKit integration for the player and Top Shelf. This gives development speed and flexibility.
What Is Top Shelf Extension and Why Do You Need It?
Top Shelf Extension allows showing dynamic content on the Apple TV home screen. Implementation via TVTopShelfContentProvider in a separate Extension target. Based on our data, this boosts user engagement by 30%. Typical Top Shelf integration costs between $1,500 and $3,000. We have implemented Top Shelf for 15 projects — none was rejected because of it. App launch time decreases by 20% with Top Shelf, and average user spend increases by 15%.
Common Mistakes When Porting iOS to tvOS
| Mistake | Consequence | Solution |
|---|---|---|
| Missing focus navigation on custom cells | Focus "gets stuck" | Implement UIFocusEnvironment or use SwiftUI |
| Ignoring parallax effects | Visually flat buttons, lower conversion | Enable adjustsImageWhenAncestorFocused |
| Using standard SwiftUI VideoPlayer without custom video player controls | Cannot show own control elements | Wrap AVPlayerViewController via UIViewControllerRepresentable |
| Incorrect handling of remote gestures | Menu button closes app instead of going back | Add UISwipeGestureRecognizer and UITapGestureRecognizer with allowedPressTypes |
| Missing parallax effects on all focusable elements | App Store Review may reject build | Check all UIImageView for adjustsImageWhenAncestorFocused |
Example Top Shelf Extension configuration
// TVTopShelfContentProvider implementation class Provider: TVTopShelfContentProvider { override func loadTopShelfContent(completion: @escaping (TVTopShelfContent?) -> Void) { let items = // ... completion(TVTopShelfContent(style: .inset, items: items)) } } What's Included in the Work
- Analysis of content model and usage scenarios (VOD, game, utility).
- Navigation design for the remote — a mandatory step.
- Development in SwiftUI + UIKit hybrid stack.
- Integration of Top Shelf, Siri Remote tvOS gestures (
UISwipeGestureRecognizer+UITapGestureRecognizerwithallowedPressTypes). - Apple TV video player setup:
AVPlayerViewControllerwith subtitle support (AVMediaSelectionGroup), chapters (AVTimedMetadataGroup), and Picture-in-Picture using AVPlayer tvOS. - Testing with physical remote and iPhone as remote via Remote app.
- Publication to App Store via separate tvOS bundle target (or universal build).
- Post-release support.
Development Process
- Analytics — competitor analysis, usability testing of scenarios. Over the years, we've conducted more than 20 audits.
- Design — navigation scheme for the remote, sketches of focus strings.
- Development — weekly iterations, demo on real Apple TV.
- Testing — functional, regression, load testing. 95% of projects pass review on first attempt.
- Deployment — via TestFlight for beta testers, then publication.
Estimated Timelines
- Simple informational or VOD app: 6–10 weeks.
- App with Top Shelf, custom player for Apple TV, and authentication: 10–16 weeks.
- Game or interactive experience — individually.
Development cost varies depending on functionality. Savings when porting from iOS can be up to 40% of the budget. For a typical tvOS app, clients invest between $12,000 and $24,000. Our certified Apple developers guarantee smooth App Store approval. With over 10 years of experience in the Apple ecosystem, we deliver proven results.
Get a consultation for your project — we'll assess complexity and propose the best solution. Contact us to discuss details and order tvOS app development.
Additional resources: read about Siri Remote and Human Interface Guidelines for tvOS.







