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
180
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
GC言語のWasm化とComponent Modelサポートの実践と課題 - Scalaの場合
tanishiking
0
130
PHP でエミュレータを自作して Ubuntu を動かそう
m3m0r7
PRO
2
150
How to stabilize UI tests using XCTest
akkeylab
0
150
AI-DLC 入門 〜AIコーディングの本質は「コード」ではなく「構造」〜 / Introduction to AI-DLC: The Essence of AI Coding Is Not “Code” but “Structure”
seike460
PRO
0
110
へんな働き方
yusukebe
6
2.9k
[PHPerKaigi 2026]PHPerKaigi2025の企画CodeGolfが最高すぎて社内で内製して半年運営して得た内製と運営の知見
ikezoemakoto
0
310
存在論的プログラミング: 時間と存在を記述する
koriym
5
580
コードレビューをしない選択 #でぃーぷらすトウキョウ
kajitack
3
1.2k
AIコードレビューの導入・運用と AI駆動開発における「AI4QA」の取り組みについて
hagevvashi
0
570
Understanding Apache Lucene - More than just full-text search
spinscale
0
140
ローカルで稼働するAI エージェントを超えて / beyond-local-ai-agents
gawa
1
190
Symfonyの特性(設計思想)を手軽に活かす特性(trait)
ickx
0
110
Featured
See All Featured
How to make the Groovebox
asonas
2
2.1k
Claude Code のすすめ
schroneko
67
220k
Design in an AI World
tapps
0
180
How Software Deployment tools have changed in the past 20 years
geshan
0
33k
RailsConf 2023
tenderlove
30
1.4k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
64
53k
Art, The Web, and Tiny UX
lynnandtonic
304
21k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
240
Building Adaptive Systems
keathley
44
3k
The World Runs on Bad Software
bkeepers
PRO
72
12k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
55k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
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