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
LINEとLINE Creators Studio iOSアプリのサーバーAPI呼び出しアーキ...
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
LINE Developers
February 13, 2019
Technology
520
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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.6k
Java 21 Overview
line_developers
6
1.4k
Code Review Challenge: An example of a solution
line_developers
1
1.7k
KARTEのAPIサーバ化
line_developers
1
650
著作権とは何か?〜初歩的概念から権利利用法、侵害要件まで
line_developers
5
2.4k
生成AIと著作権 〜生成AIによって生じる著作権関連の課題と対処
line_developers
3
2.5k
マイクロサービスにおけるBFFアーキテクチャでのモジュラモノリスの導入
line_developers
9
4.1k
A/B Testing at LINE NEWS
line_developers
3
1.2k
LINEのサポートバージョンの考え方
line_developers
2
1.6k
Other Decks in Technology
See All in Technology
データ界隈LT祭 第1回LT登壇
taromatsui_cccmkhd
1
1.3k
白金鉱業Meetup Vol.25 アウトカムが二値のデータに対するCausal Impact
brainpadpr
0
200
What the customer really needed
kawaguti
PRO
2
180
Geolonia の開発現場における AIの活用について
miya0001
0
100
事業課題から技術的負債に向き合う
sansantech
PRO
2
1.8k
AIを活用するために決めた "やらないこと" - 価値に注目する / Not betting on AI
soudai
PRO
1
520
越境するなら専門用語を使うな高校校歌 / If you wanna cross border, you shouldn't use jargon
vtryo
0
140
バイブコーディング時代のWebアプリ開発入門~Cloud Runで学ぶセキュアなビルドとデプロイ
waiwai2111
1
130
aws-iot-platform-architecture-use-cases.pdf
ma2shita
0
150
OpenTelemetryのメトリクスをCloudWatchに送ってPromQLで見てみた
ota1022
0
150
今話題のAI「Jev」って何? 宇宙最速で学ぶ会
minorun365
PRO
22
13k
【技術的負債conf】事業成長に伴う技術的負債の説明責任とAIによるモニタリング、認知的負債について
i35_267
2
1.6k
Featured
See All Featured
New Earth Scene 8
popppiees
4
2.6k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.1k
A better future with KSS
kneath
240
18k
BBQ
matthewcrist
89
10k
My Coaching Mixtape
mlcsv
0
310
Technical Leadership for Architectural Decision Making
baasie
3
570
Building the Perfect Custom Keyboard
takai
2
870
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.1k
The browser strikes back
jonoalderson
0
1.7k
How to build a perfect <img>
jonoalderson
1
6k
Art, The Web, and Tiny UX
lynnandtonic
304
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