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 App Development
Search
toshi0383
April 16, 2016
Programming
520
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
tvOS App Development
toshi0383
April 16, 2016
More Decks by toshi0383
See All by toshi0383
CoreDataはじめました
toshi0383
0
190
Swiftコードバトル必勝法
toshi0383
1
350
Sheets API使ってみた
toshi0383
2
410
visionOSについてGlobeeが取り組んでいること
toshi0383
0
600
agile20150512-150512055145-lva1-app6892.pdf
toshi0383
0
260
たのしいAirPlay
toshi0383
1
780
Profiling using Signpost
toshi0383
2
1k
AVPlayer周りの設計tips
toshi0383
6
920
cmdshelf::from("Swift")
toshi0383
3
940
Other Decks in Programming
See All in Programming
A2UI という光を覗いてみる
satohjohn
1
140
Honoでのサプライチェーン侵害対策 〜 3つのライブラリに学ぶ
yusukebe
6
1.4k
RTSPクライアントを自作してみた話
simotin13
0
620
気づいたらRubyで100作品 ー クリエイティブコーディングが生活の一部になるまで / 100 Ruby Sketches Later: How Creative Coding Became Part of My Life
chobishiba
3
590
DynamoDBには集計系のクエリがないけどなんとかしたい
musan
1
180
AIとASP.NET Coreで雑Webアプリを作った話
mayuki
0
660
ローカルLLMを使ってB2Bサービスを作っていての学び
yaotti
0
200
技術記事、AIに書かせるか、自分で書くか? 〜それでも私が自分の手で書く理由〜 / #QiitaConference
jnchito
2
1.4k
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
210
Java × distroless で 軽量なコンテナイメージを / Java on Distroless
contour_gara
0
550
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
720
技術記事、 専門家としてのプログラマ、 言語化
mizchi
13
6.3k
Featured
See All Featured
Being A Developer After 40
akosma
91
590k
A designer walks into a library…
pauljervisheath
211
24k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
250
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
340
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.6k
Chasing Engaging Ingredients in Design
codingconduct
0
220
Building Applications with DynamoDB
mza
96
7.1k
GitHub's CSS Performance
jonrohan
1033
470k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.5k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Transcript
TVOS APP DEVELOPMENT APRIL 16, 2016 SAT. 1 — ©
Toshihiro Suzuki 2016
TOSHIHIRO SUZUKI > ླ ढ़༟ > @toshi0383 > iOS/Mac/tvOS develper
> currently at NEXTSCAPE 2 — © Toshihiro Suzuki 2016
TOSHIHIRO SUZUKI > Develops Apps and contribute to OSS >
Drives go-kart > Drummer > Snowboarder > try! Swift attendee 3 — © Toshihiro Suzuki 2016
TVOS IS A NEW PLATFORM WE CAN USE THE NEWEST
APIS 4 — © Toshihiro Suzuki 2016
TO TRY OUT NEW THINGS 5 — © Toshihiro Suzuki
2016
IS FUN. 6 — © Toshihiro Suzuki 2016
APPLETV 7 — © Toshihiro Suzuki 2016
HAS VERY UNIQUE USER INTERFACE. IT'S OUR NEW TOY !
8 — © Toshihiro Suzuki 2016
ALSO THERE IS 9 — © Toshihiro Suzuki 2016
NO SCREEN ROTATIONS 10 — © Toshihiro Suzuki 2016
WHICH IS GREAT. 11 — © Toshihiro Suzuki 2016
TODAY I WILL SHARE > our daily development and codebase.
> tvOS specific topics > Readability tips 12 — © Toshihiro Suzuki 2016
PROJECT ! 13 — © Toshihiro Suzuki 2016
THE APP > is kind of like Netflix. > Already
available on iOS/Android, AndroidTV, TVs > We're middle of development. We're not the owner of the service. 14 — © Toshihiro Suzuki 2016
DAILY DEVELOPMENT 15 — © Toshihiro Suzuki 2016
LIBRARY 16 — © Toshihiro Suzuki 2016
CARTHAGE $ cat Cartfile github "rs/SDWebImage" "master" github "toshi0383/TVMLKitchen" github
"cbpowell/MarqueeLabel-Swift" github "duemunk/Async" github "ReactiveX/RxSwift" github "ikesyo/Himotoki" github "ishkawa/APIKit" ~> 1.3 github "realm/realm-cocoa" github "radex/SwiftyUserDefaults" "master" github "malcommac/SwiftDate github "AliSoftware/OHHTTPStubs" I checkin Carthage/Build/tvOS to repo. ! git history data gets larger " Build is fast 17 — © Toshihiro Suzuki 2016
OTHER LIBRARIES > inamiy/DebugLog > Fabric (Crashlytics) > DRM Manager
SDK (Static Library written in C) 18 — © Toshihiro Suzuki 2016
SWIFTLINT FOR CODE FORMATTING 19 — © Toshihiro Suzuki 2016
SWIFTGEN FOR CODE GENERATING 20 — © Toshihiro Suzuki 2016
TESTING ! 21 — © Toshihiro Suzuki 2016
PLAIN XCTEST > runs on Bitrise on every git-push >
mostly tests for models > couple of async test > No UITests any more (we've quit) 22 — © Toshihiro Suzuki 2016
OHHTTPSTUBS 23 — © Toshihiro Suzuki 2016
TEST FAILS ❌ 24 — © Toshihiro Suzuki 2016
You might get unwanted assertionFailure() caused by server API response.
25 — © Toshihiro Suzuki 2016
SOLUTION /// Calls assertionFailure unless isRunningTests() is true /// This
is useful in such case like when /// unstable API causes UITests failure. (which happens like always...) /// - parameter msg: func assertionError(msg: String = "") { if !isRunningTests() { assertionFailure(msg) } } 26 — © Toshihiro Suzuki 2016
ISRUNNINGTESTS() /// Detects if app is running xctest /// -
returns: true if running xctest func isRunningTests() -> Bool { let env = NSProcessInfo.processInfo().environment - if let path = env["XCInjectBundle"] { // Xcode7.2 - return NSString(string: path).pathExtension == "xctest" - } + if let _ = env["XCTestConfigurationFilePath"] { // Xcode7.3 + return true + } if let _ = env["UITest"] { return true } return false } 27 — © Toshihiro Suzuki 2016
"UITEST" ENV VARIABLE /// HogeUITests.swift func setup() { ... let
app = XCUIApplication() app.launchEnvironment["UITest"] = "" 28 — © Toshihiro Suzuki 2016
BETA DISTRIBUTING ! 29 — © Toshihiro Suzuki 2016
30 — © Toshihiro Suzuki 2016
TVOS IS NOT SUPPORTED. 31 — © Toshihiro Suzuki 2016
32 — © Toshihiro Suzuki 2016
MAKEFILE TEST_DESTINATION=-destination "platform=tvOS Simulator,name=Apple TV 1080p,OS=latest" TEST=xcodebuild $(XCODEFLAGS) -scheme $(SCHEME)
clean test $(TEST_DESTINATION) .PHONY: test beta release archive clean ipa-beta ipa ship test: set -o pipefail $(TEST) 33 — © Toshihiro Suzuki 2016
MAKEFILE archive: ./script/check-xcode-version.sh if [ $? -ne 0 ];then exit
1;fi ./script/prepare_for_release.sh if [ ! -d $(BUILD_DIR)/script ];then mkdir -p $(BUILD_DIR)/script;fi xcodebuild -project $(PROJECT).xcodeproj -scheme $(SCHEME) \ -destination "generic/platform=tvOS" \ -xcconfig ./config/App-tvOS.xcconfig \ -archivePath $(ARCHIVE_PATH) \ PROVISIONING_PROFILE=$(PROVISIONING_PROFILE) \ -verbose \ archive | xcpretty --color ipa: xcodebuild -exportArchive -archivePath $(ARCHIVE_PATH) -exportPath $(BUILD_DIR) \ -exportOptionsPlist $(EXPORT_OPTION_PLIST) \ PROVISIONING_PROFILE=$(PROVISIONING_PROFILE) \ -destination "generic/platform=tvOS" 34 — © Toshihiro Suzuki 2016
35 — © Toshihiro Suzuki 2016
TVOS IS NOT SUPPORTED. 36 — © Toshihiro Suzuki 2016
GITHUB RELEASE PAGE fastlane ios upload ipa:$(IPA_PATH) My boss will
download this app and hand it to testers and customers. 37 — © Toshihiro Suzuki 2016
HOW TO INSTALL A BETA APP TO DEVICE You always
need a Xcode 38 — © Toshihiro Suzuki 2016
NOTE TVOS APPS CANNOT DISTRIBUTE USING ENTERPRISE PROVISIONING PROFILES 39
— © Toshihiro Suzuki 2016
TVOS SPECIFIC TOPICS > Focus Engine > TopShelf > TVML
> UITabBar << > UITableView << > AVPlayerViewController << 40 — © Toshihiro Suzuki 2016
UITABBAR <UITabBarController: 0x7fb3d5230c70> is trying to set 7 view controllers
when only 5 view controllers are supported on this platform. Any additional view controllers will not be shown. 41 — © Toshihiro Suzuki 2016
UITABLEVIEW 42 — © Toshihiro Suzuki 2016
AVPLAYERVIEWCONTROLLER 43 — © Toshihiro Suzuki 2016
READABILITY TIPS ! 44 — © Toshihiro Suzuki 2016
TIPS #1 USE SWIFTLINT It's good for your health. 45
— © Toshihiro Suzuki 2016
TIPS #2 Use typealias for important types typealias JSON =
[String: AnyObject] typealias ProductId = String typealias GenreId = String struct Product: Decodable { let productId: ProductId? let productQualityType: ProductQuality? 46 — © Toshihiro Suzuki 2016
TIPS #3 WRITE COMMENT, WRITE TESTS You will forget everything
in next week. I guarantee. 47 — © Toshihiro Suzuki 2016
TIPS #4 IT'S OKAY TO CODE IN YOUR LANGUAGE. enum
RequestSortType: Int { case ৽ணॱ = 1, ̑̌Իॱ = 3, ਓؾॱ = 4 } switch sortType { case .৽ணॱ: break case .̑̌Իॱ: break case .ਓؾॱ: break } 48 — © Toshihiro Suzuki 2016
TIPS #5 USE RXSWIFT WHERE NEEDED. func update(force: Bool) ->
Observable<Void> { return Observable.create { observer in guard force || needsUpdate(self, interval: Constants.APIBatchUpdateInterval) else { observer.onCompleted() return AnonymousDisposable{} } let task = self.updateChannel().bindTo(self.updateTitleList) .subscribeCompleted { observer.onCompleted() self.lastSuccessfulUpdate = NSDate() } return AnonymousDisposable{task.dispose()} } } 49 — © Toshihiro Suzuki 2016
WRAP UP I TALKED ABOUT > our daily development and
codebase. > tvOS specific topics > Readability tips 50 — © Toshihiro Suzuki 2016
AGAIN, TVOS IS A NEW PLATFORM. 51 — © Toshihiro
Suzuki 2016
IT'S BEEN GREAT EXPERIENCE TO BE PART OF THIS ECOSYSTEM.
52 — © Toshihiro Suzuki 2016
FEEL FREE TO ASK ME ANY QUESTIONS ABOUT TVOS. 53
— © Toshihiro Suzuki 2016
BTW, IF YOU WANT A TVML AND NATIVE HYBRID TVOS
APP I'VE HEARD OF TVMLKITCHEN. 54 — © Toshihiro Suzuki 2016
THANK YOU ! 55 — © Toshihiro Suzuki 2016