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
550
著作権とは何か?〜初歩的概念から権利利用法、侵害要件まで
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
エラーとアクセシビリティ
schktjm
1
1.2k
AIエージェント開発用SDKとローカルLLMをLINE Botと組み合わせてみた / LINEを使ったLT大会 #14
you
PRO
0
110
Practical Agentic AI in Software Engineering
uzyn
0
110
[ JAWS-UG 東京 CommunityBuilders Night #2 ]SlackとAmazon Q Developerで 運用効率化を模索する
sh_fk2
3
400
ChatGPTとPlantUML/Mermaidによるソフトウェア設計
gowhich501
1
130
20250913_JAWS_sysad_kobe
takuyay0ne
2
170
allow_retry と Arel.sql / allow_retry and Arel.sql
euglena1215
1
160
機械学習を扱うプラットフォーム開発と運用事例
lycorptech_jp
PRO
0
230
Codeful Serverless / 一人運用でもやり抜く力
_kensh
7
400
スマートファクトリーの第一歩 〜AWSマネージドサービスで 実現する予知保全と生成AI活用まで
ganota
2
210
5年目から始める Vue3 サイト改善 #frontendo
tacck
PRO
3
220
Automating Web Accessibility Testing with AI Agents
maminami373
0
1.2k
Featured
See All Featured
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
51
5.6k
For a Future-Friendly Web
brad_frost
180
9.9k
Making the Leap to Tech Lead
cromwellryan
135
9.5k
Music & Morning Musume
bryan
46
6.8k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Building Adaptive Systems
keathley
43
2.7k
Automating Front-end Workflow
addyosmani
1370
200k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
18
1.1k
Agile that works and the tools we love
rasmusluckow
330
21k
A designer walks into a library…
pauljervisheath
207
24k
Context Engineering - Making Every Token Count
addyosmani
1
39
Producing Creativity
orderedlist
PRO
347
40k
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