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 Developer Meet Up #2
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Yosuke Ishikawa
March 26, 2014
Technology
720
7
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
LINE Developer Meet Up #2
Yosuke Ishikawa
March 26, 2014
More Decks by Yosuke Ishikawa
See All by Yosuke Ishikawa
効率的な開発手段として VRTを活用する
ishkawa
1
260
アプリを起動せずにアプリを開発して品質と生産性を上げる
ishkawa
0
4.6k
Achieving Testability in Presentation Layer
ishkawa
4
4k
Introducing Wire: Dependency Injection by Code Generator
ishkawa
12
1.4k
Declarative UICollectionView
ishkawa
28
8.6k
Nuxt.jsが掲げる"Universal Vue.js Applications"とは何者か
ishkawa
10
2.9k
Static Dependency Injection by Code Generation
ishkawa
15
6.8k
実践クライアントサイドSwift
ishkawa
23
4.5k
JSON-RPC on APIKit
ishkawa
5
70k
Other Decks in Technology
See All in Technology
なぜSRE・セキュリティは評価されないのか?守りの組織を事業成長エンジンに変えた実践
cscengineer
PRO
3
2.4k
Where Is JetBrains AI Heading- — Central CLI, Air Alpha, and the Agentic Development Stack
x5gtrn
PRO
0
150
アリアドネの糸と、20年ごとの建て替え ── 長尾真『電子図書館』を、伊勢で読み直す / Rereading Makoto Nagao’s "Electronic Library" in Ise
ykiyota
0
150
『止めない』を設計する — 制約の中で、事業の根幹を支える判断
hiroyaterui
0
260
コスト最適化の「めんどくさい」を AWS FinOps Agent でチョット楽にする
classmethod_kaz
0
300
AI-DLCって実際どう? 〜聞きたいこと全部聞いてみる〜
news_it_enj
0
250
Redmine 7.0で私が開発した新機能の狙いと背景
vividtone
1
150
ASTを使って影響範囲を特定する
nealle
0
140
Claude in Chrome 入門 / Introduction to Claude in Chrome
cielo1985
0
130
Snowflakeのコスト最適化を支えるアーキテクチャ設計
ktatsuya
0
1.4k
こんなアーキテクチャ図は嫌だ BEYOND THE TIME: 半年後の自分へ贈る15のメッセージ / 15 of Anti-pattern in AWS Architecture Diagrams
naospon
3
300
DEFCON_CHV_CTF_Write-up.pdf
bata_24
0
130
Featured
See All Featured
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
560
A Tale of Four Properties
chriscoyier
163
24k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
How to build a perfect <img>
jonoalderson
1
6k
Design in an AI World
tapps
1
310
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
490
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
230
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
The Pragmatic Product Professional
lauravandoore
37
7.4k
Transcript
iOS Development in LINE Corp. @_ishkawa
None
None
None
• iOSΤϯδχΞ4 • খ͞Ίͷձࣾ → େ͖Ίͷձࣾ
• ίϯϙʔωϯτͷ࠶ར༻ • ձࣾͰͷiOSΤϯδχΞͷׂ ࠓͷ
• ίϯϙʔωϯτͷ࠶ར༻ • ձࣾͰͷiOSΤϯδχΞͷׂ ࠓͷ LINEʹiOSΤϯδχΞ͕ͨ͘͞Μ͍ΔͷͰ
• ίϯϙʔωϯτͷ࠶ར༻ • ձࣾͰͷiOSΤϯδχΞͷׂ ࠓͷ LINEʹඇΤϯδχΞͨ͘͞Μ͍ΔͷͰ
None
ίϯϙʔωϯτʁ
[SVProgressHUD show];
• ؆୯ʹ࣮Ͱ͖ͦ͏ʹݟ͑Δ • ࡉ෦·ͰϚδϝʹͭ͘Δͷେม • SVProgressHUD800ߦ
֤ʑ͕ಠཱʹಉ͡ͷΛ ͭ͘Δͷ͍ͬͨͳ͍ 1ॻ͍ͨΒଞͷਓ ͑ΔΑ͏ʹ͠Α͏ʂ
• ։ൃ࣌ؒͷॖ • ࣭ͷ্ • ϝϯςφϯείετͷ੍ ϝϦοτ
͍ͭॻ͍ͯΔͷʁ
ΞϓϦݻ༗Ͱͳ͍ίʔυΛ ॻ͍ͯͨΒͦͷ෦ΛΓग़͢
ྫ: ISCyclicPagesView https://github.com/ishkawa/ISCyclicPagesView
• ແݶεΫϩʔϧόφʔ • 22ίϛοτ • 200ߦ
ΞϓϦͷίʔυͱಉ͡ॻ͖ํʁ
ΞϓϦͷίʔυͱಉ͡ॻ͖ํʁ
• ඞཁेͳΠϯλʔϑΣʔε • ଞͷ෭࡞༻Λؚ·ͳ͍ ཁ͢ΔʹߦّΑ͘
• ඞཁेͳΠϯλʔϑΣʔε • ଞͷ෭࡞༻Λؚ·ͳ͍
มߋՄೳͳϓϩύςΟΛߜΔ @interface ISCyclicPagesView : UIScrollView ! @property (nonatomic, readonly) NSInteger
currentPage; @property (nonatomic, readonly) NSInteger numberOfPages; @property (nonatomic, assign) id <ISCyclicPagesViewDataSource> dataSource; @property (nonatomic, assign) id <ISCyclicPagesViewDelegate> delegate; ! - (void)reloadData; - (void)scrollToPage:(NSInteger)page direction:(NSInteger)direction animated:(BOOL)animated; ! - (NSInteger)pageForView:(UIView *)view; - (UIView *)viewForPage:(NSInteger)page; ! @end
֎͔ΒݺΕ͍͍ͯϝιουͷΈΛެ։ @interface ISCyclicPagesView : UIScrollView ! @property (nonatomic, readonly) NSInteger
currentPage; @property (nonatomic, readonly) NSInteger numberOfPages; @property (nonatomic, assign) id <ISCyclicPagesViewDataSource> dataSource; @property (nonatomic, assign) id <ISCyclicPagesViewDelegate> delegate; ! - (void)reloadData; - (void)scrollToPage:(NSInteger)page direction:(NSInteger)direction animated:(BOOL)animated; ! - (NSInteger)pageForView:(UIView *)view; - (UIView *)viewForPage:(NSInteger)page; ! @end
෦ॲཧ༻ͷϓϩύςΟެ։͠ͳ͍ @interface ISCyclicPagesView () ! @property (nonatomic) NSInteger currentPage; @property
(nonatomic) NSInteger numberOfPages; @property (nonatomic, strong) NSArray *reusableViews; ! @end
෦ॲཧ༻ͷఆެ։͠ͳ͍ static NSInteger const ISReusableViewsCount = 3;
• ඞཁेͳΠϯλʔϑΣʔε • ଞͷ෭࡞༻Λؚ·ͳ͍
Өڹൣғͷେ͖͍֦ு view.frame = CGRectMake(10.f, view.frame.origin.x, view.frame.size.width, view.frame.size.height); view.x = 10.f;
Өڹൣғͷେ͖͍֦ு @implementation UIView (Additions) ! - (CGFloat)x { return self.frame.origin.x;
} ! - (void)setX:(CGFloat)x { CGRect frame = self.frame; frame.origin.x = x; self.frame = frame; } ! @end
App Library x setX: x setX: ͲͪΒͷx, setX:ͷ࣮͕࣮ߦ͞ΕΔͷ͔ෆఆ
Өڹൣғͷେ͖͍֦ு @implementation UIView (Additions) ! - (CGFloat)x { return self.frame.origin.x;
} ! - (void)setX:(CGFloat)x { CGRect frame = self.frame; frame.origin.x = x; self.frame = frame; } ! @end
ϥΠϒϥϦ֎ͷมߋΛͳΔ͘ආ͚Δ [UIView appearance].backgroundColor = [UIColor blueColor]; ! [UIApplication sharedApplication].statusBarHidden =
YES;
Ͳ͜ͰίʔυΛެ։͢Δ͔ʁ
None
ձࣾݻ༗ͷίʔυ߹
Πϯετʔϧߋ৽Λ ؆୯ʹ͢Δʹʁ
http://cocoapods.org
Demo
ϥΠϒϥϦΛॻ͍ͨΒ CocoaPodsʹରԠͤ͞Α͏
ϥΠϒϥϦΛॻ͍ͨΒ podspecΛॻ͜͏
Pod::Spec.new do |s| s.name = "ISDiskCache" s.version = "0.1.1" s.platform
= :ios, "4.3" s.summary = "LRU disk cache for iOS." s.homepage = "https://github.com/ishkawa/ISDiskCache" s.source_files = "ISDiskCache/**/*.{h,m}" s.requires_arc = true s.author = { "Yosuke Ishikawa" => "
[email protected]
" } s.source = { :git => "https://github.com/ishkawa/ISDiskCache.git", :tag => "0.1.1" } s.license = { :type => "MIT", :text => <<-LICENSE ... LICENSE } end podspec
podspecͷஔ͖ʁ
• ϥΠϒϥϦͷϦϙδτϦ • CocoaPodsͷϦϙδτϦ • In HouseͷϦϙδτϦ
• ϥΠϒϥϦͷϦϙδτϦ • CocoaPodsͷϦϙδτϦ • In HouseͷϦϙδτϦ
None
None
pod 'ISDiskCache', :git => ‘https://github.com/ishkawa/ISDiskCache.git', :tag => '0.1.1' Podfile
• ϥΠϒϥϦͷϦϙδτϦ • CocoaPodsͷϦϙδτϦ • In HouseͷϦϙδτϦ
CocoaPods/Specs ͜͜ʹొ͞Ε͍ͯΕ ࣗಈతʹօͷखݩʹೖΔ podspec Pull Request https://github.com/CocoaPods/Specs
https://github.com/CocoaPods/Specs/pull/2780
pod 'ISDiskCache', '~> 0.1.1' Podfile
• ϥΠϒϥϦͷϦϙδτϦ • CocoaPodsͷϦϙδτϦ • In HouseͷϦϙδτϦ
CocoaPods/Specs ಠࣗͷpodspecஔ͖ΛՃͰ͖Δ LINE-Corp/Specs
None
pod repo add in-house https://github.com/ishkawa/CocoaPodsSpecs.git Command
pod 'ISDiskCache', '~> 0.1.1' Podfile
None
LINEͰͷίʔυͷ࠶ར༻ͷ·ͱΊ
• ͔ͤͬ͘ॻ͍ͨίϯϙʔωϯτෳνʔϜͰ࠶ར༻ • ΞϓϦݻ༗Ͱͳ͚ΕϥΠϒϥϦͱͯ͠Γग़ͯ͠ެ։ • ϥΠϒϥϦͷίʔυߦّྑ͘ॻ͘ • CocoaPodsʹରԠͤͯ͞ར༻͘͢͢͠Δ
LINEͰGitHub Enterpriseͱ CocoaPodsΛར༻ͯ͠ ίʔυͷ࠶ར༻ΛਐΊ͍ͯ·͢
• Pull RequestͰίʔυϨϏϡʔ • Ϣχοτςετͷಋೖ ࠷ۙࣾʹ͜ΜͳྲྀΕ͋Γ·͢
None
iOSΤϯδχΞͷׂ = iOSΞϓϦͷ։ൃ
ϓϩάϥϜΛॻ͘ + ͦͷଞଟ
αʔϏεઃܭ UIઃܭ UIϓϩτλΠϐϯά ςετέʔεͷ࡞ શόʔδϣϯͰಈ࡞֬ೝ ϞϯΩʔςετ ར༻౷ܭͷઃܭ Dev Centerͷ࡞ۀ iTunes
Connectͷ࡞ۀ
ϓϩάϥϜΛॻ͘ + ͦͷଞଟ ͬͪ͜ʹूத͍ͨ͠
• اը/σβΠϯઌߦͷϑϩʔ • खް͍QA LINEͷಛ
• اը/σβΠϯઌߦͷϑϩʔ • खް͍QA LINEͷಛ
αʔϏεઃܭ UIσβΠϯ ࣮ QA ͜͜ͰࢀՃ͢Δ
• اը/σβΠϯઌߦͷϑϩʔ • खް͍QA LINEͷಛ
• QAઐ෦͕୲ • ෳਓ͕શόʔδϣϯͷOSͰςετ • ࠶ݱঢ়گΛৄࡉʹใࠂͯ͠Β͑Δ • ༧ͷ3ഒͷෆ۩߹Λൃݟͯ͠Β͑Δ ※ ݸਓͷײͰ͢
ϦϦʔεલޙͷετϨε͕͔ͳΓܰݮ͞ΕΔ
LINEʹiOSΤϯδχΞ͕ ։ൃʹूதͰ͖Δڥ͕͍ͬͯ·͢
LINEͰiOSΤϯδχΞΛืू͍ͯ͠·͢