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
📺
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Boris Bügling
March 02, 2016
Programming
2k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
📺
Introduction to tvOS development, given at try! Swift 2016 in Tokyo. 🇯🇵
Boris Bügling
March 02, 2016
More Decks by Boris Bügling
See All by Boris Bügling
Testing ⌚️ Apps and Other Extensions
neonichu
1
4.7k
Cross-platform Swift
neonichu
4
18k
Building better API clients in Swift
neonichu
1
350
Cross-platform Swift
neonichu
3
960
Swift Package Manager
neonichu
2
370
Swift Package Manager
neonichu
0
85
Cross-Platform Swift
neonichu
0
140
Swift Package Manager
neonichu
6
4.4k
Bring your apps to the big screen 📺
neonichu
1
640
Other Decks in Programming
See All in Programming
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
840
どこまでゆるくて許されるのか
tk3fftk
0
470
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
480
フィードバックで育てるAI開発
kotaminato
1
110
「正の参照」と 「負の導出」で組む ハーネスエンジニアリング
cottpan
1
140
【やさしく解説 設計編 #0】DDDのコード、読めるのに分からない人へ
panda728
PRO
2
260
エンジニアにデザインハーネスを 〜デザインプロセスを規定するためのハーネス〜 / Design harness from an engineer's perspective
rkaga
2
1.4k
【やさしく解説 設計編 #1】「ドメイン駆動」と「実装駆動」ってなに? 〜設計の考え方を、たとえ話で学ぼう〜
panda728
PRO
1
110
関数型プログラミングのメリットって何だろう?
wanko_it
0
160
えっ!!コードを読まずに開発を!?
hananouchi
0
190
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
580
自作OSでスライド発表する
uyuki234
1
3.8k
Featured
See All Featured
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
230
From π to Pie charts
rasagy
0
230
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
220
Music & Morning Musume
bryan
47
7.3k
Testing 201, or: Great Expectations
jmmastey
46
8.2k
Unsuck your backbone
ammeep
672
58k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
150
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
330
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
370
HDC tutorial
michielstock
2
740
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
290
Transcript
! TRY! SWIFT, MARCH 2016 BORIS BÜGLING - @NEONACHO
None
COCOAPODS
CONTENTFUL
None
“‘I’d like to create an integrated television set that is
completely easy to use,’ he told me. [...] ‘It will have the simplest user interface you could imagine. I finally cracked it.’”
OCTOBER 21, 2011
SEPTEMBER 9, 2015
None
None
The future of TV is iOS
1 1 https://twitter.com/davidolesch/status/656126103921160192
WEBKIT
MULTIPEERCONNECTIVITY
STORAGE LIMITATIONS ▸ app is limited to 200 MB ▸
500 KB of persistent storage (NSUserDefaults) ▸ Use iCloud ▸ Use On-Demand resources
PORTING EXISTING APPS
COCOAPODS ▸ Supports tvOS since 0.39.0 ▸ New platform: platform
:tvos, '9.0'
PODS NOT SUPPORTING TVOS If you are adventurous ! https://github.com/orta/cocoapods-expert-difficulty
SPRITEKIT EXAMPLE
None
DOOM CLASSIC ▸ UIKit changes (UIAlertView, UISlider) ▸ AudioSession isn't
available ▸ Newer C++ compiler
NIBS ! If you don't feel like copy-pasting stuff between
NIBs ! https://github.com/neonichu/bohne
NO DIRECT MANIPULATION
FOCUS ENGINE UIButton().canBecomeFocused() // == true or false UIButton().focused //
== true or false UIScreen.mainScreen().focusedView // nil or the view in focus
DEMO
REACTING TO FOCUS CHANGES func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator)
context.nextFocusedView // the view which gets the focus context.previouslyFocusedView // the view which had the focus func addCoordinatedAnimations(_ animations: (() -> Void)?, completion completion: (() -> Void)?)
CUSTOMFOCUSVIEW class CustomFocusView: UIView { override func canBecomeFocused() -> Bool
{ return true } }
CUSTOMFOCUSVIEW override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) { coordinator.addCoordinatedAnimations({
// ... }, completion: nil) }
CUSTOMFOCUSVIEW let duration = UIView.inheritedAnimationDuration() UIView.animateWithDuration(duration, animations: { if context.nextFocusedView
== self { self.backgroundColor = UIColor.redColor() } if context.previouslyFocusedView == self { self.backgroundColor = UIColor.whiteColor() } })
DEBUGGING FOCUS print(view.performSelector("_whyIsThisViewNotFocusable")) e.g. for a UILabel Unmanaged<AnyObject>(_value: ISSUE: This
view has userInteractionEnabled set to NO. Views must allow user interaction to be focusable. ISSUE: This view returns NO from -canBecomeFocused. )
GOOD PLACES FOR BREAKPOINTS func shouldUpdateFocusInContext(_ context: UIFocusUpdateContext) -> Bool
func didUpdateFocusInContext(_ context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator)
GESTURES AND BUTTON PRESSES let tapRecognizer = UITapGestureRecognizer(target: self, action:
"tapped:") let pressTypes = [NSNumber(integer: UIPressType.PlayPause.rawValue)] tapRecognizer.allowedPressTypes = pressTypes; self.view.addGestureRecognizer(tapRecognizer) let swipeRecognizer = UISwipeGestureRecognizer(target: self, action: "swiped:") swipeRecognizer.direction = .Right self.view.addGestureRecognizer(swipeRecognizer)
LOWER-LEVEL API: UIPress Very similar to UITouch-based API in iOS
func pressesBegan(presses: Set<UIPress>, withEvent event: UIPressesEvent?) func pressesEnded(presses: Set<UIPress>, withEvent event: UIPressesEvent?) func pressesChanged(presses: Set<UIPress>, withEvent event: UIPressesEvent?) func pressesCancelled(presses: Set<UIPress>, withEvent event: UIPressesEvent?)
TEXT INPUT
SIRI?
HANDOFF IS ALSO NOT SUPPORTED
https://github.com/rsattar/Voucher
GAME CONTROLLERS
None
SIRI REMOTE IS ALSO A GAME CONTROLLER ▸ Profile GCMicroGamepad
▸ Touch surface is a dpad ▸ Two action buttons ▸ Motion (GCMotion) ▸ Seems not to work in the simulator
NSNotificationCenter.defaultCenter().addObserverForName(GCControllerDidConnectNotification, object: nil, queue: nil) { (note) in if let
controller = note.object as? GCController { if let microPad = controller.microGamepad { microPad.dpad.valueChangedHandler = { (_, x, y) in if let paddle = self.childNodeWithName("Paddle") { paddle.position.y += CGFloat(y) } } } } }
GAME CONTROLLERS WORK WITH UIKIT COMPONENTS
2.27 If your app’s core functionality doesn’t work with the
Siri remote it will be rejected. The app may, however, provide enhanced functionality in connection with a game controller or other peripheral
None
A maximum of two game controllers (plus one remote) can
be connected to an Apple TV at any given time.
DEMO
TVML
CONCLUSION ▸ tvOS works very well ▸ If you know
UIKit, it's easy to start ▸ Think about interaction
RESOURCES ▸ https://developer.apple.com/tvos/human-interface-guidelines/ ▸ "Ich glotz TV", @avbelow, Macoun 2015
▸ https://speakerdeck.com/toco/intro-to-tvos ▸ http://nerds.airbnb.com/tvos-focus-engine/ ▸ https://eternalstorms.wordpress.com/2015/10/05/pair-the-apple- tv-developer-kit-siri-remote-with-xcodes-simulator/
THANKS!
@NeoNacho
[email protected]
http://buegling.com/talks