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
LINEとLINE Creators Studio iOSアプリのサーバーAPI呼び出しアーキ...
Search
LINE Developers
February 13, 2019
Technology
500
0
Share
LINEとLINE Creators Studio iOSアプリのサーバーAPI呼び出しアーキテクチャをリファクタリングした話 / Refactor API invocation archtecture in LINE & LINE Creators Studio
2019/2/13に開催されたLINE Developer Meetup #50 in Fukuokaでの登壇資料です
LINE Developers
February 13, 2019
More Decks by LINE Developers
See All by LINE Developers
LINEスタンプのSREing事例集:大きなスパイクアクセスを捌くためのSREing
line_developers
3
2.5k
Java 21 Overview
line_developers
6
1.3k
Code Review Challenge: An example of a solution
line_developers
1
1.6k
KARTEのAPIサーバ化
line_developers
1
630
著作権とは何か?〜初歩的概念から権利利用法、侵害要件まで
line_developers
5
2.3k
生成AIと著作権 〜生成AIによって生じる著作権関連の課題と対処
line_developers
3
2.5k
マイクロサービスにおけるBFFアーキテクチャでのモジュラモノリスの導入
line_developers
9
3.9k
A/B Testing at LINE NEWS
line_developers
3
1.1k
LINEのサポートバージョンの考え方
line_developers
2
1.5k
Other Decks in Technology
See All in Technology
需要創出(Chatwork)×供給(BPaaS) フライホイールとMoat 実行能力の最適配置とAI戦略
kubell_hr
0
2.1k
AI時代に越境し、 組織を変えるQAスキルの正体 / QA Skills for Transforming an Organization
mii3king
5
4.1k
EMから幅を広げるために最近挑戦していること / Recent challenges I'm undertaking to expand my horizons beyond EM
hiro_torii
1
180
自動テストだけで リリース判断できるチームへ - 鍵はテストの量ではなくリリース判断基準の再設計にあった / Redesigning Release Criteria for Lightweight Releases
ewa
7
3.5k
AI 時代の Platform Engineering
recruitengineers
PRO
1
110
拝啓、あの夏の僕へ〜あなたも知っているApp Runnerの世界〜
news_it_enj
0
220
AIの揺らぎに“コシ”を与える階層化品質設計
ickx
0
260
ハーネスエンジニアリング入門
knishioka
0
130
Agent の「自由」と「安全」〜未来に向けて今できること〜
katayan
0
340
色を視る
yuzneri
0
320
Percolatorを廃止し、マルチ検索サービスへ刷新した話 / Search Engineering Tech Talk 2026 Spring
visional_engineering_and_design
0
330
サービスの信頼性を高めるため、形骸化した「プロダクションミーティング」を立て直すまでの取り組み
stefafafan
1
250
Featured
See All Featured
The Mindset for Success: Future Career Progression
greggifford
PRO
0
320
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
61
43k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
1
530
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
180
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.2k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.2k
Optimizing for Happiness
mojombo
378
71k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.4k
Designing for Performance
lara
611
70k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Transcript
LINE Fukuoka ։ൃ1ࣨ ։ൃCνʔϜ Δ;(@_ha1f) LINEͱLINE Creators Studio iOSΞϓϦͷ αʔόʔAPIݺͼग़͠
ΞʔΩςΫνϟΛ ϦϑΝΫλϦϯάͨ͠ 2019/2/13 LINE Developer Meetup #50 in Fukuoka
Δ; • iOS Developer of LINE Fukuoka (New graduate of
2017) • LINE Creators Studio -> LINE SHOP part (October, 2018)
Agenda • LINE Creators StudioͷLINEϩάΠϯप ΓΛSDKΞοϓσʔτͷ͍ͭͰʹΈ ͔Β୯७Խͯ͠ɺObservableͰָʹѻ͑ ΔΑ͏ʹͨ͠ • LINE
SHOPύʔτͷLINEελϯϓͷϦ ιʔεཧΛେنΒ͘͠ΑΓΓ͚ Δ͜ͱͰཧͨ͠
Agenda • LINE Creators StudioͷLINEϩάΠϯप ΓΛSDKΞοϓσʔτͷ͍ͭͰʹΈ ͔Β୯७Խͯ͠ɺObservableͰָʹѻ͑ ΔΑ͏ʹͨ͠ • LINE
SHOPύʔτͷLINEελϯϓͷϦ ιʔεཧΛେنΒ͘͠ΑΓΓ͚ Δ͜ͱͰཧͨ͠
LINE Creators Studio • 2017ϦϦʔεɺΊͬͪΌRxSwift • LINEϩάΠϯͰϢʔβʔΛཧʢLINE SDKΛར༻ʣ • LINE
SDK v1 → v2ͷΞοϓσʔτͷඞཁɻɹɹɹɹɹɹɹɹɹ ͍ͭͰʹೝূɺτʔΫϯͷཧΛϦϑΝΫλϦϯάͨ͠
OAuth ैདྷͷೝূʢInitialʣ LINE Auth Server Creators Studio Server ᶃCredential ᶄLINE
token/refresh token ᶅLINE token/refresh token ᶆLINE Token ᶇvalid/invalid ᶈToken/refresh token • OAuthΛ༻͍ͨೝূ
OAuth ैདྷͷೝূʢInitialʣ LINE Auth Server Creators Studio Server ᶃCredential ᶄLINE
token/refresh token ᶅLINE token/refresh token ᶆLINE Token ᶇvalid/invalid ᶈToken/refresh token • OAuthΛ༻͍ͨೝূ
OAuth ैདྷͷೝূʢInitialʣ LINE Auth Server Creators Studio Server ᶃCredential ᶄLINE
token/refresh token ᶅLINE token/refresh token ᶆLINE Token ᶇvalid/invalid ᶈToken/refresh token • OAuthΛ༻͍ͨೝূ
ैདྷͷೝূʢRefreshʣ LINE Auth Server Creators Studio Server ᶃrefresh token ᶃLINE
refreshToken ᶄLINE token/refresh token ᶄToken/refresh token • LINEτʔΫϯΛCreators StudioαʔόʔͰอ࣋ͯ͠ɺແݶʹϦϑϨογϡͯ͠active֬ೝ • ΫϥΠΞϯτCreators StudioαʔόʔͷτʔΫϯͷΈཧ
LINE SDK v2ͷΞοϓσʔτ • ΫϥΠΞϯτଆͰRefresh token͕औಘෆՄʹͳͬͨʢAPIͷݺͼग़͠Ͱ͖Δʣ • αʔόʔͰ࣋ͯΔͷظݶͷ͍tokenͷΈ • ʢ͔ࣾͩΒSDKॻ͖͑ΕऔΕΔ͚Ͳʣͦͦαʔόʔ͚ͩͰϩάΠϯঢ়ଶ
ΛӬଓԽͰ͖ΔͷͳͷͰʁ →طଘͷΈΛద༻ෆՄೳ
ΈΛม͑Α͏ʂ
ैདྷͷೝূͰͷRefresh LINE Auth Server Creators Studio Server ᶃrefresh token ᶄLINE
refreshToken ᶅLINE token/refresh token ᶆToken/refresh token • token͕ࣦޮ͍ͯͨ͠߹ʹ֬ೝ͢Δखஈ͕ͳ͍
Ҋ LINE Auth Server Creators Studio Server ᶅrefresh token, LINE
token ᶆLINE token ᶇvalid/invalid ᶈToken/refresh token • ClientͰrefreshͯ͠ɺLINE tokenΛ͏ҰճૹΕ͍͍ʁ ᶄLINE token/refresh token ᶃLINE refresh token
Ҋ LINE Auth Server Creators Studio Server ᶅrefresh token, LINE
token ᶆLINE token ᶇvalid/invalid ᶈToken/refresh token • ϩάΠϯͱಉ͡ʂ ᶄLINE token/refresh token ᶃLINE refresh token
Ҋ LINE Auth Server Creators Studio Server ᶅLINE token ᶆLINE
token ᶇvalid/invalid ᶈToken • Refresh token͍ͦͦΒͳ͍ʂʁʂʁ • ͏ҰճϩάΠϯ͢Ε͍͍ʂ ᶄLINE token/refresh token ᶃLINE refresh token
৽͍͠ೝূ LINE Auth Server Creators Studio Server ᶄLINE token/refresh token
ᶅLINE token ᶆLINE Token ᶈToken • ಠࣗͷϦϑϨογϡͷΈΛͳͨ͘͠ • ৽͍͠LINEͷτʔΫϯͰ࠶ϩάΠϯ͢ΔΠϝʔδ ᶃCredential or LINE refresh token ᶇvalid/invalid
݁Ռʁ • ΤϯυϙΠϯτ͕ݮͬͯΈ͕୯७Խʂ • Ͱɺ͍͍͜ͱ͚ͩʁ
৽ͨͳ ΫϥΠΞϯτͷ ঢ়ଶཧ
401ͳΒࣗಈͰ ϦϑϨογϡͯ͠ ϦτϥΠ
Observable<T> • ඇಉظॲཧͷϑϨʔϜϫʔΫɺReactiveXͷجૅ֓೦ • onNext, onCompleted, onErrorͷࡾछྨͷΠϕϯτΛൃੜͤ͞Δ • ৭ʑͳΠϕϯτΛObservable<T>ͷܗͰද͢͜ͱ͕Ͱ͖Δ Subscribe
Observable<T> onNext onCompleted onError Observer
Observable<Response> • ௨৴͢Δͱ͖ͷObservable Subscribe Caller onNext(response) onCompleted Observable<Response> ϦΫΤετ Ϩεϙϯε
Observable<Data> • σίʔυΛڬΜͰΠϯλʔϑΣʔεಉ͡ Subscribe Caller Observable<Response> ϦΫΤετ Ϩεϙϯε σίʔυ onNext(response)
onCompleted
Observable<Response> • λΠϜΞτΤϥʔ Subscribe Caller onError Observable<Response> ϦΫΤετ λΠϜΞτ Τϥʔ
ܭଌ։࢝
Observable<Data> • Τϥʔ͕ҧͬͯΠϯλʔϑΣʔεಉ͡ Subscribe Caller Observable<Response> ϦΫΤετ Ϩεϙϯε σίʔυ onError
σίʔυΤϥʔ
Observable<Token> • ϩάΠϯΛObservableͱͯ͠ଊ͑Δͱ Subscribe Observable<Token> ϦΫΤετ Ϩεϙϯε ϩάΠϯը໘ Cancel Done
Caller onNext(token) onCompleted
Observable<Token> • ϩάΠϯΩϟϯηϧ Subscribe Observable<Token> ϩάΠϯը໘ Cancel Done Caller onError
Observable<Token> • ·ͱΊΔͱ͜Μͳײ͡ Subscribe Observable<Token> ϦΫΤετ Ϩεϙϯε ϩάΠϯը໘ Cancel Done
Caller onNext(token) onCompleted onError
Observable<Data> • ·ͱΊΔͱ͜Μͳײ͡ Subscribe Caller Observable<Data> ϦΫΤετ Ϩεϙϯε σίʔυ onError
σίʔυΤϥʔ λΠϜΞτΤϥʔ onNext(response) onCompleted
Observable<Result> • ෳࡶͳϩδοΫΛӅṭͰ͖Δ onNext onError Subscribe
Observable<AccessToken> • AccessTokenࣗମObservableͱͯ͠औಘ͢Δ onNext onError Subscribe
Observable<LineToken> • ը໘ભҠؚΊͯObservable onNext onError Subscribe
લͷ·ͱΊ • refreshͷΤϯυϙΠϯτ͕ෆཁʹͳΓɺlogin͚ͩʹ·ͱ·ͬͨ • ෳࡶͳঢ়ଶObservableͰஈ֊తʹԾԽͯ͠ɺετϨεͳ͘௨৴Ͱ͖ΔΑ͏ʹ ͳͬͨ
͓·͚ɿshare()ΕDDoSࣄނʹҙ • ಉ࣌ʹϦΫΤετ͕ࣦഊ͢ΔͱɺϦϑϨογϡͷແݶϧʔϓͷՄೳੑɾɾɾ ᶃෳͷ401 ᶄෳͷSubscribe ᶆτʔΫϯࣦޮʹΑΔࣦഊ ᶅෳͷrefreshʢલͷτʔΫϯͷinvalidateʣ ᶇ࠶ϦτϥΠʹΑΔsubscribe
Agenda • LINE Creators StudioͷLINEϩάΠϯप ΓΛSDKΞοϓσʔτͷ͍ͭͰʹΈ ͔Β୯७Խͯ͠ɺObservableͰָʹѻ͑ ΔΑ͏ʹͨ͠ • LINE
SHOPύʔτͷLINEελϯϓͷϦ ιʔεཧΛେنΒ͘͠ΑΓΓ͚ Δ͜ͱͰཧͨ͠
What is LINE SHOP Part? LINE(Messenger) • ػೳɾλεΫ͝ͱʹ୲ɺͦΕͧΕͰϨϏϡʔ LIFF Album
SHOP LINE Pay Chat Registration LINE Beacon Timeline LINE News
What is LINE SHOP Part? LINE(Messenger) • ػೳɾλεΫ͝ͱʹ୲ɺͦΕͧΕͰϨϏϡʔ LIFF Album
SHOP LINE Pay Chat Registration LINE Beacon Timeline LINE NEWS
What is LINE SHOP Part? LINE SHOP Part • ελϯϓɾֆจࣈɾணͤସ͑ؔ࿈ͷػೳɾը໘Λ୲
• γϣοϓը໘ͱ͔ɺελϯϓཧը໘ͱ͔ɺΩʔϘʔυͱ͔ɺελ ϯϓͷϑΣονɾΩϟογϡͷػೳͱ͔ • ϑΣονͱ͔ͷΛ͠·͢
Sticker Fetcher • CallerTalkRoomͱ͔Keyboardͱ͔ • ϩʔΧϧʹͳ͚Εαʔόʔ͔Βऔಘ • Ұμϯϩʔυͨ͠ΒϩʔΧϧʹΩϟογϡ
ैདྷͷ࣮ • APIΫϥε࡞ͬͯ • FileManagerΫϥε࡞ͬͯ
LGTM!
But…
func imageName() -> String func stickerUrl() -> URL func imageUrl()
-> URL func fetchSound() -> URL func localSticker() -> UIImage func fetchSticker() -> UIImage func fetchPopupStatic() -> UIImage func localUrl() -> URL func stickerName() -> String … Sticker Fetcher was…
func imageName() -> String func stickerUrl() -> URL func imageUrl()
-> URL func fetchSound() -> URL func localSticker() -> UIImage func fetchSticker() -> UIImage func fetchPopupStatic() -> UIImage func localUrl() -> URL func stickerName() -> String … Sticker Fetcher was… !
ͳͥෳࡶ͔ • ελϯϓࣗମͷछྨͷଟ͞ • ը૾ͷछྨͷଟ͞ • ύοέʔδͱελϯϓ • ΞχϝʔγϣϯɺϙοϓΞοϓɺαϯυɺΞχϝʔγϣϯαϯυɺ… •
छྨʹΑΓඞཁͳϦιʔε͕ҟͳΔ • τʔΫɺγϣοϓৄࡉɺγϣοϓҰཡɺΩʔϘʔυɺΩʔϘʔυλϒɺ2x… • ͦΕͧΕͷ໊લɾঢ়ଶΛཧ͢Δඞཁ • ύοέʔδணͤସ͑ɾֆจࣈڞ௨ɺελϯϓผ
৽͍࣮͠ • ໊લཧɾURLཧΛׂ • ϗϯτPackage Image Fetcher࡞Ζ͏ͱ͕ͨ͠ɺ ໋໊ͰेΘ͔Γ͘͢ͳͬͨ
struct RemoteUrl { static var baseURL: URL static func stickerImageName()
static func stickerImageUrl() static func stickerSoundFileUrl() static func packageImageName() static func packageImageUrl() } Remote URL • ҙࣝͯ͠PackageͱStickerΛ۠ผ
Α͔ͬͨ͜ͱ • ΊͬͪΌΘ͔Γ͘͢ͳͬͨ • Ϣχοτςετ͕ॻ͖͘͢ͳͬͨ
ޙͷ·ͱΊ • نʹ߹ΘͤͨΞʔΩςΫνϟ͕ඞཁ • ͗͢Δ͙Β͍͕ͪΐ͏Ͳ͍͍͜ͱ
THANK YOU
Observableͷৄࡉ https://qiita.com/_ha1f/items/e16ddc6017c4ad807c3c