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
0
490
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
Tweet
Share
More Decks by LINE Developers
See All by LINE Developers
LINEスタンプのSREing事例集:大きなスパイクアクセスを捌くためのSREing
line_developers
3
2.4k
Java 21 Overview
line_developers
6
1.3k
Code Review Challenge: An example of a solution
line_developers
1
1.5k
KARTEのAPIサーバ化
line_developers
1
600
著作権とは何か?〜初歩的概念から権利利用法、侵害要件まで
line_developers
5
2.3k
生成AIと著作権 〜生成AIによって生じる著作権関連の課題と対処
line_developers
3
2.4k
マイクロサービスにおけるBFFアーキテクチャでのモジュラモノリスの導入
line_developers
9
3.8k
A/B Testing at LINE NEWS
line_developers
3
1.1k
LINEのサポートバージョンの考え方
line_developers
2
1.4k
Other Decks in Technology
See All in Technology
Bill One急成長の舞台裏 開発組織が直面した失敗と教訓
sansantech
PRO
2
380
学生・新卒・ジュニアから目指すSRE
hiroyaonoe
2
620
Red Hat OpenStack Services on OpenShift
tamemiya
0
110
FinTech SREのAWSサービス活用/Leveraging AWS Services in FinTech SRE
maaaato
0
130
Codex 5.3 と Opus 4.6 にコーポレートサイトを作らせてみた / Codex 5.3 vs Opus 4.6
ama_ch
0
150
OWASP Top 10:2025 リリースと 少しの日本語化にまつわる裏話
okdt
PRO
3
770
20260204_Midosuji_Tech
takuyay0ne
1
160
SRE Enabling戦記 - 急成長する組織にSREを浸透させる戦いの歴史
markie1009
0
120
インフラエンジニア必見!Kubernetesを用いたクラウドネイティブ設計ポイント大全
daitak
1
360
コスト削減から「セキュリティと利便性」を担うプラットフォームへ
sansantech
PRO
3
1.5k
Contract One Engineering Unit 紹介資料
sansan33
PRO
0
13k
会社紹介資料 / Sansan Company Profile
sansan33
PRO
15
400k
Featured
See All Featured
A Tale of Four Properties
chriscoyier
162
24k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
190
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
110
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
76
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
9.5k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
190
The Power of CSS Pseudo Elements
geoffreycrofte
80
6.2k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
93
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
380
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
1.9k
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