Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
📺
Boris Bügling
March 02, 2016
Programming
0
1.6k
📺
Introduction to tvOS development, given at try! Swift 2016 in Tokyo. 🇯🇵
Boris Bügling
March 02, 2016
Tweet
Share
More Decks by Boris Bügling
See All by Boris Bügling
Testing ⌚️ Apps and Other Extensions
neonichu
1
4.3k
Cross-platform Swift
neonichu
4
17k
Building better API clients in Swift
neonichu
1
250
Cross-platform Swift
neonichu
3
770
Swift Package Manager
neonichu
2
300
Swift Package Manager
neonichu
0
38
Cross-Platform Swift
neonichu
0
62
Swift Package Manager
neonichu
6
3.9k
Bring your apps to the big screen 📺
neonichu
1
350
Other Decks in Programming
See All in Programming
JGS594 Lecture 23
javiergs
PRO
0
400
About Type Syntax Proposal
quramy
1
1.1k
mrubyを1300円のボードで動かそう
yuuu
0
180
Yumemi.apk #6 ~ゆめみのAndroidエンジニア 日頃の成果大発表会!~ Session 2
blendthink
1
210
dbtとBigQueryで始めるData Vault入門
kazk1018
0
180
バンドル最適化マニアクス at tfconf
mizchi
3
2.1k
Kueue入門/Kueue Introduction
bells17
0
510
A technique to implement DSL in Ruby
okuramasafumi
0
660
microCMS × imgixを活用して品質とレスポンスを両立したポートフォリオサイトを作成した話
takehitogoto
0
400
職場にPythonistaを増やす方法
soogie
0
300
スモールチームがAmazon Cognitoでコスパよく作るサービス間連携認証
tacke_jp
2
300
【Qiita Night】新卒エンジニアによるSwift6与太予想
eiji127
0
180
Featured
See All Featured
5 minutes of I Can Smell Your CMS
philhawksworth
196
18k
ParisWeb 2013: Learning to Love: Crash Course in Emotional UX Design
dotmariusz
100
5.9k
Rails Girls Zürich Keynote
gr2m
86
12k
Learning to Love Humans: Emotional Interface Design
aarron
261
37k
Statistics for Hackers
jakevdp
781
210k
Six Lessons from altMBA
skipperchong
14
1.3k
WebSockets: Embracing the real-time Web
robhawkes
57
5k
What's new in Ruby 2.0
geeforr
336
30k
Code Reviewing Like a Champion
maltzj
506
37k
Designing Experiences People Love
moore
130
22k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
498
130k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
314
19k
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 boris@contentful.com http://buegling.com/talks