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.3k
Java 21 Overview
line_developers
6
1.2k
Code Review Challenge: An example of a solution
line_developers
1
1.4k
KARTEのAPIサーバ化
line_developers
1
570
著作権とは何か?〜初歩的概念から権利利用法、侵害要件まで
line_developers
5
2.2k
生成AIと著作権 〜生成AIによって生じる著作権関連の課題と対処
line_developers
3
2.2k
マイクロサービスにおけるBFFアーキテクチャでのモジュラモノリスの導入
line_developers
9
3.6k
A/B Testing at LINE NEWS
line_developers
3
1k
LINEのサポートバージョンの考え方
line_developers
2
1.3k
Other Decks in Technology
See All in Technology
事業開発におけるDify活用事例
kentarofujii
4
1.1k
現場データから見える、開発生産性の変化コード生成AI導入・運用のリアル〜 / Changes in Development Productivity and Operational Challenges Following the Introduction of Code Generation AI
nttcom
1
400
AI時代におけるデータの重要性 ~データマネジメントの第一歩~
ryoichi_ota
0
700
「魔法少女まどか☆マギカ Magia Exedra」の多様なバトルの開発を柔軟かつ効率的に実現するためのPure C#とUnityの分離について
gree_tech
PRO
0
150
Wasmの気になる最新情報
askua
0
170
[2025年10月版] Databricks Data + AI Boot Camp
databricksjapan
1
220
新規事業におけるGORM+SQLx併用アーキテクチャ
hacomono
PRO
0
440
All About Sansan – for New Global Engineers
sansan33
PRO
1
1.2k
私のMCPの使い方
tsubakimoto_s
0
110
ソフトウェアエンジニアの生成AI活用と、これから
lycorptech_jp
PRO
0
690
OSSで50の競合と戦うためにやったこと
yamadashy
3
620
ニッポンの人に知ってもらいたいGISスポット
sakaik
0
190
Featured
See All Featured
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.5k
Why You Should Never Use an ORM
jnunemaker
PRO
59
9.6k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.5k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
132
19k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.5k
Art, The Web, and Tiny UX
lynnandtonic
303
21k
Testing 201, or: Great Expectations
jmmastey
45
7.7k
Visualization
eitanlees
149
16k
Being A Developer After 40
akosma
91
590k
Principles of Awesome APIs and How to Build Them.
keavy
127
17k
4 Signs Your Business is Dying
shpigford
185
22k
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