Last active
January 13, 2016 00:21
-
-
Save tiagomartinho/7aed9c8b2d6651ea7e6d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Intro | |
Mindset, best practices, etc. | |
The future of TV vs Mobile, different rates of innovation | |
Apps: Media (Netflix, youtube, HBO, etc.) -> optimised for the apple tv | |
Zoova, fitness | |
Gilt shopping | |
Games, disney infinity (like console gaming) | |
Does not commute | |
Alto adventure | |
Madeira , digital comic book | |
Children Apps, sago mini fairy tales | |
Beginning -> bring from mobile | |
tvOS Fundamentals | |
* Living room experience | |
used from distance: focus-based interaction, larger, focus and shadows | |
the attention should be on content | |
communal vs individual experiences, shared device with multiple people interacting, in group or at different hours | |
* always connected (high speed internet connection) vs mobile | |
http live streaming | |
on-demand resources > limited storage for apps | |
cloud storage | |
* powerful hardware | |
new performance baseline | |
separate SDK > standalone binary (vs iPhone iPad) | |
same tools > swift Xcode objective-c | |
same frameworks > base for apps, plus great support for media and gaming | |
living room experience | |
connect people to content > direct , even if far away | |
with remote you use gestures, small or quick ovements | |
connected, clear, immersive | |
parallax delight and connect | |
things should be intuitive, where user are, hard to read text, dense UI, | |
navigation should be clear, one in-out path | |
San Francisco optimised for large distances, responds to accessibility | |
grid and focus item | |
clear where you are at the moment | |
no ambiguous gestures | |
cinematic experience with edge-to-edge background of movie images | |
touch surface, menu, play/pause are available for the app | |
not for multi touch gestures with two fingers, uses one-finger gestures | |
Play/pause for playback or game shortcuts | |
Menu is the back button for navigation (no back buttons on the UI) | |
Accelerometer and Gyro available for use > can help to connect users with the content | |
also in landscape > break neck game | |
move content in the expected direction (inverse of direct manipulation like iOS) *except in fullscreen mode or games | |
buttons can have different (Distinct) states, unselected, selected focus, highlighted, disabled | |
focus should be obvious > test: look out of the TV and look back, the content at focus is obvious? | |
you can add animation to make it easy | |
measurements for grids and spacing are available for use at guidelines | |
clicks instead of taps, taps can be made accidentally, click is intentionally and often will be a better option | |
focus model | |
finger movement, next view in focus, how to move and animate focus, parallax, speed adaption | |
focus engine handle all the (numerous) tasks related to focus model | |
Focus API > focusable view, initial focus, current focus, | |
canBecomeFocused, | |
new protocol UIFocusEnvironment , preferredFocusedView | |
table and collection views add delegate methods for focus model | |
new read-only properties for UIView and UIScreen | |
don’t set the focus manually, the user should be in control fo the focus | |
ambitious cases, views removed, new view presented or dismissed -> focus update requests | |
use can become focused and preferred focused view | |
you can request focus, set need focus update and update focus if needed | |
for collection view cells: adjusts image when ancestor is focused | |
respond to focus changes, ex. show/hide label with animation | |
animation timing responds to speed of swipe in the remote, fast movements make faster animations | |
didUpdateFocusInContext | |
using focus guides to guide focus when UI is not clear to focus model where to move | |
debugging focus, why is this view not focusable, and with Quick Look option in debugger, | |
handling button presses, custom behaviour for play/pause, | |
with gesture recogniser, allowed press types , UIPressTypes -> Select, Menu, Play/Pause | |
tap edges of the remote Up, Left, Right, Down, Arrow, works on siri remote, and with game controllers Pads | |
low level event handling, touch API also available, coordinates are from center of focused view | |
use Siri Remote as a game controller directly , using game controller framework | |
Digital Pad windowing , repotsAblosuteDpadsValues, framework creates window where user first puts the finger is the center and all values are relative to a virtual window | |
dpad values are in portrait , adapt it with allows rotation property | |
menu button in gameplay toggle pause/resume instead of handling navigation | |
integrating with UIKit with controller user interaction enabled property | |
disable screensaver timeout with idleTimerDisabled property, not always but only while in gameplay | |
device motion with GCMotion profile, access accelerometer and gyroscope *already filtered *fused data from both sensors | |
not intended for vigorous shaking aggressive movements | |
limitation: you can use one siri remote plus up to two mfi controllers | |
take input from all controllers if possible | |
On demand resources | |
Instead of getting all bundle and based on user interactions and predictions you download the resources you need > example, user downloads game and based on the next level they are playing you download resources for that level, and when no longer using it you free the resources | |
Dynamically loaded content, hosted in the App Store | |
Prioritized downloads, intelligent caching | |
What the customer gets with on-demand resources? Better install experience with reduced time install, more apps on the device, up to 20GB of content | |
Install tags (download on demand) for the content and prefetch tags (immediately download after install) | |
Base app up to 200MB, on-demand up to 20GB, in use up to 2GB | |
nsbundleresourcerequest | |
Initialize with set of tags. Begin requests. Tell the system when you are finished. | |
Track progress of request *you should not have need to use this, anticipate the user needs better | |
Set loading priority | |
Special urgent priority , the user is waiting for this | |
Is content available? Conditionally begin accessing resources with completion handler | |
Preservation priority to tell the system how important is to keep around the disk, not actively used, this is used for caching, it is relative to your app not system wide (don't set it to 100 to keep it around more than other apps ;) | |
Testing ODR | |
Xcode and Xcode server: artificial download, correctness not performance | |
TestFlight : closer to deploy, real world performance , network link conditioner | |
Embed in build, build settings to embed assets into the app, not correct for App Store, distribute ad hoc outside of App Store | |
Host from your web server, internal web server, for example enterprise scenario | |
Data storage | |
Mindset | |
iCloud key-value store, small | |
CloudKit, structured and bulk data | |
User might not be signed in | |
Multiple people may be sharing device | |
Public data is available even if user is not signed in | |
Single sign in account per user | |
Temporary data, subject to purge | |
Media playback experience | |
Video player does a lot of heavy lifting for you | |
AV foundation | |
Info panel, language, subtitles, sound | |
Scrubbing | |
Avfoundation, avkit, on tvos | |
Avasset single media asset , file or streaming | |
Asynchronous API | |
avplayeritem, references single asset, metadata | |
Avplayer, manages playback of avplayeritem , avqueueplayer plays multiple items in sequence | |
Avplayer view controller | |
Metadata into info panel, in set in avplayeritem or set external metadata | |
"What did he/she just say" feature of Siri uses this metadata | |
Interstitial time ranges, time ranges not part of actual content (ads,legal,warnings,etc.) no skipping for example | |
Avoid swapping players to display interstitial | |
AV player view controller delegate methods for managing interstitial , example disabling skipping | |
Rare cases can use AV player layer, use it when you want to customize the playback experience, no controls or ui, zoova uses it to skip exercises | |
File based | |
Local bundle, ORD or cached | |
Downloaded prior playback | |
Very short clips | |
Streaming | |
http live streaming HLS | |
segments downloaded during playback | |
Adaptive based on connection | |
HLS is the ideal way to provide media on the Apple TV | |
It based on the Internet connection status | |
H.264/avc codec | |
Up to 60fps | |
audio can add described video track for accessibility | |
To support "trick play" it is needed to add frames with EXT I FRAMES | |
subtitles are important for accessibility of for the "what did he just say" Siri feature | |
Preparing and presenting media for accessibility wwdc13 | |
TVMLKIT is used by the App Store, music and video apps from Apple | |
Used where the server content is the focus of the app | |
template based language | |
Offers consistent UI | |
Reduced development effort with shorten time to market | |
Leverage existing client server architectures | |
Provide native experience | |
XML document that defines UI | |
Is not a web browser | |
Link the JavaScript with swift or objective c | |
Setup cache control header appropriately | |
TVJS framework has access to system frameworks | |
Bridging from/and to native to JavaScript | |
Evaluate in JavaScript context | |
Debugging with Safari web inspector | |
Sample projects with content server are available | |
Best practices for designing tvos apps | |
Common questions and problems | |
loading is constant | |
At all costs avoid blank screens | |
Use placeholder for images | |
Activity indicators or somethings that indicates progress, does not commute and Rayman adventures do it very well | |
Set expectations to loading time | |
Use loading time to educate (useful info) or entertain | |
Galaxy on Fire app when loading shows the story or if you skip show game tips | |
Authentication, try to avoid it | |
payment systems need it | |
Delay until necessary | |
Gilt app lets browse everything without sign in until you buy | |
If asking emails use the correct keyboard that shows the Recent emails entered in any system app | |
You can create a companion app to do more complex authentication behaviors | |
Not on the high street app completes the payment with an iOS companion application, it finds the device with the bonjour technology | |
Include fast profile switching | |
Make restore purchases obvious | |
On boarding | |
Critical to show how to use an app | |
Get out of the way | |
People want entertainment not read instructions | |
Badland app does not show any instructions when starting | |
It should not be a crutch for a bad UI | |
Show controls | |
Breakneck app pause gameplay to show controls | |
Transistor app show different instructions based on the controller you are using | |
Click with Siri remote, or press buttons with other controllers | |
Alto adventures show instructions as you go | |
Galaxy of fire app shows controls as soon as you tap the menu button | |
Anticipate the need for help | |
Using a cursor to point something is wrong , the focus model is right | |
Design the loading experience | |
Delay authentication | |
Onboard gradually | |
Use the focus model and no cursors | |
It is a totally new device, design specifically for this platform don't try to port from Mac or iOS | |
Tuning you tv os app | |
Bendled pixels | |
Accidental transparency, set view opaque if it is not transparent | |
Flat view hierarchy | |
Eliminate unnecessary transparency | |
Heavy use of images | |
Scaled images , can be a hit in performance | |
Misaligned images can cause a resize | |
Use auto layout to take care of it | |
Visual effects | |
Color offscreen render | |
Reduce redundant rendering | |
Use appropriate asset size | |
Minimize per frame load | |
Use bitmap caching when needed | |
Instruments are your best friend | |
Top shelf | |
Static image, not interactive | |
If your app was moved to the top the users are already using it, no place to capture users | |
Dynamic content can be used to promote content , ship it o the first version otherwise people may lose it, it is not linked to the bundle so it is always update | |
Sing by smule app does it with image content | |
Zoova shows content most relevant for the user | |
Featured content | |
Newsy app | |
Saves step by going directly to content | |
You can use play to start immediate playback | |
Provide shortcut to app | |
Can be personalized | |
Tv top shelf provider protocol | |
Top shelf style, inset or section | |
Tv content item, an array to populate the shelf | |
Image ratio and other metadata | |
If section you return an array with the sections | |
Linking to content, custom URL scheme for your app and respond to system calls. | |
Play url goes directly to playback when play button | |
Implement play and display for all content on the top shelf, posting to different parts of your app | |
Let the system know when the items will need to change using notifications : tv top shelf items did change notification | |
App Store distribution and marketing | |
Over 100 countries | |
Handpicked by Apple | |
Editorial curated | |
Searching the app and top charts | |
Business considerations | |
Business model | |
The same as iOS | |
Free, gilt, Airbnb | |
Paid once, alto | |
Freemium, free to download pay after | |
Paymium, pay to download pay after | |
Reach, revenue or both | |
Solution to you and your users | |
Freemium can be good | |
Find the right price for throughly charge users | |
What kind of model does your user expect | |
Longer but less frequent uses | |
More people using the app | |
Periodic quick use vs lasting value | |
Consider it during development | |
Important questions that affect you product development | |
Universal purchase | |
Not reversible | |
Purchase once and use it in iOS and tvos | |
In app purchases | |
Considerations | |
Reach revenue or both? | |
Customer don't want to pay both, but if you offer something different it may work | |
Content right limitations , show in mobile and tv may not be the same | |
Global expansion | |
Global business | |
iOS 154 countries | |
They like to feature local content | |
Consider the top markets | |
Leverage your own data | |
Localize it right, meet customer expectations | |
Every visitor is a potential customer | |
Icon | |
App name, match uniqueness, short, no Apple TV trademarks | |
Great screenshots | |
First 3/4 lines are the most important | |
Keywords are important for ASEO | |
Use all 100 characters commas not necessary no plurals no category | |
Add relevant keywords by understanding well the rules | |
Marketing guidance | |
Apple TV approved image in guidelines | |
Download at the App Store badge | |
Add icon imagery | |
Saga mini fairy tales app | |
Getting feature | |
Apps that customer will love | |
Make a great app | |
Is the app unique? | |
What make people love your app? | |
Engaging living room experience, group of people | |
Intuitive use of Siri remote | |
Fantastic first time user, on boarding , don't use on boarding screens, don't pop up login at start | |
Performance matters, slow loading speed, freezes or crashes | |
Designed for Apple TV | |
Understand the process | |
Refreshed every Thursday | |
Themes and holidays, fitness app in January , zoova! | |
Preference for localized content | |
Focus on initial launch and significant updates | |
Let us know | |
Product details, Apple ID and App Store link | |
Tell what makes special | |
Product roadmap | |
Marketing material | |
Contact before online, 3/4 weeks | |
appstorepromotion@apple.com | |
Quality first | |
Right business model | |
Universal purchase | |
Think global be local | |
Create a great product page | |
Market your app |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I have some notes to share from NYC if you like. Might match up..