Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Backend-Driven UI: Making Screens Dynamic
Search
yhkaplan
October 16, 2020
Programming
1.9k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Backend-Driven UI: Making Screens Dynamic
yhkaplan
October 16, 2020
More Decks by yhkaplan
See All by yhkaplan
Using the latest UICollectionView APIs
yhkaplan
0
3.6k
Swift and Concurrency: The Plan for World Domination
yhkaplan
0
230
Migrating from UIKit to SwiftUI efficiently
yhkaplan
4
4k
Property Wrappers
yhkaplan
0
630
Parser Combinators
yhkaplan
0
330
The Great Swift Migration
yhkaplan
1
4.3k
Speeding Up Your CI
yhkaplan
0
520
Automate All the Things
yhkaplan
4
2.7k
Other Decks in Programming
See All in Programming
dotNET_vulnclicker_intro.pdf
deka_morita
0
150
Snowflake Openflow Connector利用の勘所 / 20261024developersio2026tokyo-snowflake-openflow
kasacchiful
PRO
0
180
PumaからFalconに移行したRailsアプリケーションでの実践
falcon8823
0
240
AmebaブログはKMPから卒業します
kmars0605
0
240
AIで開発が速くなった先で、開発チームは何を目指すか
shihochan
1
1.8k
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
1.2k
現場と育てるRailsモデリング 〜Spreadsheetから始めたモデル設計〜
siroemk
2
960
When benchmarks go bad - what I learned from measuring performance wrong
hollycummins
0
240
Railsバージョンを4倍にした話
optim
0
730
AI時代のTerminal環境を UNIX哲学で設計・運用する
yasunori0418
1
220
Compiling a real-world CLI tool to native with Static Hermes
tmikov2023
0
130
APNsからLive Activityを開始する話
yumnumm
0
180
Featured
See All Featured
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
600
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
450
sira's awesome portfolio website redesign presentation
elsirapls
0
470
Testing 201, or: Great Expectations
jmmastey
46
8.4k
How to train your dragon (web standard)
notwaldorf
96
6.9k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
The Cost Of JavaScript in 2023
addyosmani
55
10k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
4
1.2k
Statistics for Hackers
jakevdp
799
230k
Transcript
Backend-Driven UI: Making Screens Dynamic 1
Self-intro — Name: Joshua Kaplan (@yhkaplan) — Work: minne @
GMO Pepabo — Interests: ! CI/CD, " frameworks, and more — Hobbies: # bread, $ history, and running 2
What is a backend driven UI? — Extreme end: every
individual view defined by backend — Less extreme: order of and type of view defined by backend — Why JSON? 3
Purpose — Change content for each customer — A/B testing
— Feature flags — Less work to make changes 4
Demo 5
How I made it — Prototype in sample app —
Use compositional layout and diffable data sources — Define each section type as JSON w/ a title and subtitle — Firebase Remote Config 6
Code Example let homeReducer = Reducer<HomeState, HomeAction, HomeEnvironment> { state,
action, environment in switch action { case .loadSectionData: state.isSectionLoading = true return environment.homeService.homeContentPublisher() .replaceError(with: []) .receive(on: DispatchQueue.main) .map { HomeAction.loadItemData(sections: $0) } .eraseToEffect() case let .loadItemData(sections): state.isSectionLoading = true return environment.homeService.sectionItemsPublisher(sections: sections) .replaceError(with: [:]) .receive(on: DispatchQueue.main) .map { HomeAction.setSections(sections: $0) } .eraseToEffect() } return .none } 7
Challenges/risks — App Review risks (AKA don’t pull a Fortnite)
— Server unavailable 8
Other possible approaches — Defining more in JSON — microsoft/AdaptiveCards
— spotify/HubFramework — Web views 9
Conclusion — Easy to strike a balance w/ compositional layout
— Think of important, frequently changing screens — Worth it for minne — Try it out in a prototype! — yhkaplan/Shop 10