Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
tvOS for the iOS developer
Search
Josh Brown
November 02, 2015
Programming
0
170
tvOS for the iOS developer
An overview of the similarities and differences between developing for tvOS and iOS
Josh Brown
November 02, 2015
Tweet
Share
Other Decks in Programming
See All in Programming
Honoを使ったリモートMCPサーバでAIツールとの連携を加速させる!
tosuri13
1
180
React 19でつくる「気持ちいいUI」- 楽観的UIのすすめ
himorishige
11
7.4k
「ブロックテーマでは再現できない」は本当か?
inc2734
0
1k
Raku Raku Notion 20260128
hareyakayuruyaka
0
330
AI巻き込み型コードレビューのススメ
nealle
2
410
Package Management Learnings from Homebrew
mikemcquaid
0
230
AIと一緒にレガシーに向き合ってみた
nyafunta9858
0
240
MDN Web Docs に日本語翻訳でコントリビュート
ohmori_yusuke
0
650
AIによる高速開発をどう制御するか? ガードレール設置で開発速度と品質を両立させたチームの事例
tonkotsuboy_com
7
2.4k
FOSDEM 2026: STUNMESH-go: Building P2P WireGuard Mesh Without Self-Hosted Infrastructure
tjjh89017
0
170
AIによる開発の民主化を支える コンテキスト管理のこれまでとこれから
mulyu
3
370
ノイジーネイバー問題を解決する 公平なキューイング
occhi
0
110
Featured
See All Featured
Reality Check: Gamification 10 Years Later
codingconduct
0
2k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
1.9k
How to build a perfect <img>
jonoalderson
1
4.9k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
290
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
3.9k
Bash Introduction
62gerente
615
210k
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.8k
Marketing to machines
jonoalderson
1
4.6k
Transcript
tvOS for the iOS developer
What's similar to iOS? → everything → Xcode, Interface Builder,
Objective-C, Swift → frameworks (UIKit, Metal, CloudKit, Game Center, and more)
What's different from iOS? → user interaction (Siri remote) →
focus engine → a few missing parts → the App Store and assets → (new) TVML, JavaScript, TVMLKit → views & view controller appearance
User interaction
None
None
Remote
None
Focus
"A UI element is in focus when the user highlights
an item, but has not selected an item."
Focus → UIFocusGuide → Adam made some awesome slides
None
What do these have in common? → Photos framework →
Multipeer Connectivity → EventKit → local storage → web views
Storage → no persistent local storage → NSUserDefaults: 500K →
CloudKit
None
App Store: Required Assets → Layered icons: App Store, Home
screen → Top Shelf Image → Launch image → Screen shots
Parallax on tv → app icons → movies → TV
shows
Layered icon Three layers → Front → Middle → Back
Layered icon Two sizes → Large: 1280 x 768 →
Small: 400 x 240
Top Shelf image
None
Capture (just like iOS) → Screen shots: Xcode → Video:
QuickTime Player
None
Views & View Controllers UIKitCatalog
None
TVML
TVML and JavaScript "client-server apps whose primary purpose is to
stream media"
Why TVML? you can change stuff after it's deployed
TVML Architecture
None
TVML and JavaScript 1. write some TVML (XML) & JavaScript
2. put it on your server 3. write a TVMLKit app that points to your server 4. submit your TVMLKit app to Apple
None
<document> <mainTemplate> <background> <img src="path to images on your server/Car_Movie_1920x1080"
/> </background> <menuBar> <section> <menuItem> <title>PLAY</title> </menuItem> <menuItem> <title>SCENES</title> </menuItem> <menuItem> <title>EXTRAS</title> </menuItem> </section> </menuBar> </mainTemplate> </document>
// application.js doc.addEventListener("play", startPlayback); // ... function startPlayback(event) { var
player = new Player(); // ... player.playlist.push(video); // ... player.play(); }
class AppDelegate: UIResponder, UIApplicationDelegate, TVApplicationControllerDelegate { var appController: TVApplicationController? static
let TVBaseURL = "http://localhost:9001/" static let TVBootURL = "\(AppDelegate.TVBaseURL)js/application.js" func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // ... let appControllerContext = TVApplicationControllerContext() if let javaScriptURL = NSURL(string: AppDelegate.TVBootURL) { appControllerContext.javaScriptApplicationURL = javaScriptURL } appControllerContext.launchOptions["BASEURL"] = AppDelegate.TVBaseURL appController = TVApplicationController(context: appControllerContext, window: window, delegate: self) // ... }
thanks
Questions? @jtbrown
Further Reading tv Human Interface Guidelines 200MB Max, No Storage,
No Web Views: Is tvOS the Future of Apps? Beginning tvOS Development with TVML Tutorial