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
ランタイムデバッグのススメ/iOSDC21
Search
noppefoxwolf
September 19, 2021
Technology
5.7k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ランタイムデバッグのススメ/iOSDC21
noppefoxwolf
September 19, 2021
More Decks by noppefoxwolf
See All by noppefoxwolf
High performance GIF playback/iOSDC25
noppefoxwolf
1
620
Spice up your notifications/try!Swift25
noppefoxwolf
3
840
iOSの隠されたAPIを解明し、開発効率を向上させる方法/iOSDC24
noppefoxwolf
2
1.3k
今から理解するApp Intentエコシステム/WWDC24Recap
noppefoxwolf
0
74
既存アプリをvisionOS対応してリリースした話/visionOS LT vol5
noppefoxwolf
0
230
UIのブラックボックスを探る/iOSDC23
noppefoxwolf
3
5.1k
CoreGraphicsでドット絵を描こう/iOSDC22
noppefoxwolf
0
3.2k
google/mediapipe で始めるARアプリ開発/iOSDC2020
noppefoxwolf
1
1.7k
モバイルファーストなアプリを作るためにvearがしたこと/xRDCC
noppefoxwolf
0
200
Other Decks in Technology
See All in Technology
え?フロントエンドエンジニアの ワイがインフラも!?
puku0x
1
430
修正PRを食べてレビュースキルが賢くなる:Claude Codeによる自己改善サイクル
yuyaumetsu
5
1.4k
システム思考で問題に対処する
yussak
0
200
モバイルアプリ開発概論2026
recruitengineers
PRO
3
500
トヨタ⽣産⽅式(TPS)⼊⾨
recruitengineers
PRO
2
640
【CEDEC2026】ゲームシナリオライターを支援するAIツール開発の実践 ― 設計とプロンプトの工夫 ―
cygames
PRO
1
770
AI時代の強いチームの作り方
yuukiyo
25
16k
サイバー捜査員研修(後半)
nomizone
1
810
組織にどうSREを根付かせるか?〜IVRyの場合〜
abnoumaru
0
330
Flutterをカメラで動かしたかった話
sony
1
130
【CEDEC2026】『GRANBLUE FANTASY: Relink - Endless Ragnarok』のバトル制作事例 ~最高のキャラゲーを目指して~
cygames
PRO
0
230
クラウドセキュリティ入門 ~安全なクラウド利用のための基礎知識~
lhazy
11
8.4k
Featured
See All Featured
How to Ace a Technical Interview
jacobian
281
24k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
RailsConf 2023
tenderlove
30
1.5k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
430
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
My Coaching Mixtape
mlcsv
0
210
Designing for Performance
lara
611
70k
Un-Boring Meetings
codingconduct
0
380
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
840
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Transcript
ϥϯλΠϜσόοάͷεεϝ iOSDC2021 TrackA Day2 noppe / iOS app developer 1
noppe - noppefoxwolf • גࣜձࣾσΟʔɾΤψɾΤʔ • ιʔγϟϧϥΠϒPococha • ݸਓΞϓϦ։ൃ •
όʔνϟϧࣗࡱΓΞϓϦvear 2
3
4
• ऩͷ2िؒલʹࢠڙ͕࢈·Ε·ͨ͠ • ऩதʹٽ͖࢝ΊͨΒΓ͠ʹͳΓ·͢ 5
6
7
ଘࡏ͠ͳ͍୯ޠͳͷͰ… ఆٛ ࣮ߦதͷΞϓϦͰɺσόοάΛ͢Δ͜ͱ1 ≒ ࣮ػςετ ͱ͠·͢ɻ 1 ͜ͷηογϣϯͷதͰͷఆٛ
ର • ςελʔ • ΞϓϦΤϯδχΞ • QA୲ऀ • σβΠφʔ ...etc
※ ࣮ػσόοάΛਪ͢ΔηογϣϯͰ͋Γ·ͤΜɻ ࣮ػσόοάͤ͟Δಘͳ͍έʔεͱ͍͏લఏͰ͓ฉ͖͍ͩ͘͞ɻ 9
Ұൠతͳ։ൃϑϩʔ 1. ίʔσΟϯάɾ༷ࡦఆɾetc 2. ίϯύΠϧ 3. γϛϡϨʔλɾσόΠε࣮ߦɾϥΠϒϓϨϏϡʔ 4. UnitTest 5.
݁߹ςετ 6. CI 7. QA 8. ϕʔλςετ 9. ϦϦʔεςετ 10. ຊ൪ςετ 10
ϥϯλΠϜσόοάͷಛ 1. ਓ͕ؒख࡞ۀͰߦ͏࣌ؒతίετ • ≒ۚમతίετ • ≒ࣄۀϦεΫ 2. ఆੑతͳҙݟͷ׆༻ͷ͠͞ •
ʮͳΜ͔ॏ͍ؾ͕͢ΔʯΛͲ͏ѻ͏͔ 11
1.࣌ؒతίετͷվળ 12
ݕূͷվળ ϥϯλΠϜσόοάͷϑϩʔ 1. ίϯύΠϧ 2. సૹ 3. ڥͷ֬ೝ 4. ը໘·Ͱͷૢ࡞
5. ಈ࡞ݕূ ͜ΕΒͷͲ͜ʹͲΜͳ͕͔͔͍࣌ؒͬͯΔͷ͔ΛΔඞཁ͕͋Δɻ 13
ݕূͷվળ 3.ڥͷ֬ೝ • όʔδϣϯ൪߸ɺϏϧυ൪߸ • ϩάΛݟΔ • OSͷόʔδϣϯɺϞσϧ • ઃఆΞϓϦ͔Βࢀর
• Ϗϧυͷ࠷ऴ୲ऀ ...etc 14
3.ڥͷ֬ೝ A. ΞϓϦͷதͰݟΕΔΑ͏ʹ͠ɺૢ࡞Λল͘ • ͳΜͰ͔ΜͰදࣔͤͣɺඞཁͳใ͔ݟۃ ΊΔ • ߲ςελʔʹώΞϦϯά • ֬ೝʹίϛϡχέʔγϣϯ͕ඞཁͳͷ͕
ͳ͍͔ • ख࡞ۀʹΑΔૢ࡞͕ඞཁͳͷ͕ͳ͍͔ 15
σόοάϝχϡʔ • ςελʔ͚ͷಛघͳը໘ • ඇΤϯδχΞ2ʹͱͬͯɺඇৗʹڧྗͳଘࡏ 2 ࣮ͷมߋ͕ग़དྷͳ͍ςελʔ
σόοάϝχϡʔͷ࣮ 1. దͳը໘Λ༻ҙ͢Δ 2. ຊ൪Ͱݺͳ͍Α͏ʹ͢Δ 17
σόοάϝχϡʔͷ࣮ func onTapSettings(section: Section) { switch section { case .general:
... #if DEBUG // #endif·Ͱͷίʔυຊ൪ʹؚ·Εͳ͍ case .debugMenu: let vc = DebugMenuViewController() present(vc, animated: true) #endif } } #if DEBUG final class DebugMenuViewController: UITableController { ... } #endif 18
σόοάϝχϡʔͷ࣮ ։ൃ༻ػೳΛϞδϡʔϧԽ͠ɺ҆શʹ͢Δʹ Swift Packageத৺ͷϓϩδΣΫτߏ ͱͦͷ࣮ફ Day2 TrackC 14:50 େنͳΞϓϦͷϚϧνϞδϡʔϧߏ ͷ࣮ફ
Day2 TrackA 11:30 19
ݕূͷվળ 3.ڥͷ֬ೝ ࠶Ϗϧυɾ࠶ΠϯετʔϧΛ͏ڥ • ଓઌαʔόʔͷઃఆ • νϡʔτϦΞϧදࣔͷϦηοτ • Ωϟογϡͷআ 20
ݕূͷվળ 3.ڥͷ֬ೝ ࠶Ϗϧυɾ࠶ΠϯετʔϧΛ͏ڥ… σόοάϝχϡʔ͔Βઃఆɾ࣮ߦͰ͖ΔΑ͏ʹ͢ Δ 21
22
ݕূͷվળ 4.ը໘·Ͱͷૢ࡞ • ը໘ભҠ͕ଟ͍ • ௨৴ॏ͍ॲཧ͕ڬ·Δ΄Ͳ͕͔͔࣌ؒΔ • ભҠ͕݅ݫ͍͠ Hint •
ىಈ͔ΒonAppear()viewDidAppear()· Ͱͷ࣌ؒΛܭଌ͢Δ 23
ݕূͷվળ 4.ը໘·Ͱͷૢ࡞ 1. σόοάϝχϡʔ͔ΒඈΔΑ͏ʹ͢Δ 2. URLεΩʔϜ͔Βىಈ͢Δ 24
TIPS Q. ΞϓϦΛ࠶ىಈ͢Δʹ A. Shortcut.appΛ͏ 1. ड͚औͬͨURLΛSafariͰ։͘γϣʔτΧοτΛ࡞ 2. ΞϓϦ͔ΒࣗͷURLεΩʔϜΛؚΜͩγϣʔτΧοτ3Λୟ͘ 3.
ΞϓϦΛऴྃͤ͞Δ 4. Shortcut.app͕URLεΩʔϜΛ࣮ߦ 5. ΞϓϦ͕࠶ىಈ͢Δ 3 shortcuts://run-shortcut?name=shortcutName&input=text&text=urlScheme 25
DEMO 26
ݕূͷվળ 5.ಈ࡞ݕূ • ͍࣌͠Օॴ • ϑΟʔϧʢମײʣͷݕূվળͷ༨͋Γ • ΞχϝʔγϣϯɾδΣενϟʔɾײ֮ϑΟʔυόοΫ • ඍௐ͕ଟ͘ɺ࠶Ϗϧυଟ͍
27
ݕূͷվળ ύϥϝʔλͷௐ࣮ߦதʹग़དྷΔΑ͏ʹ͢Δ • ࣮ίετ͕͔͔ΔͷͰɺΞϓϦͷίΞͷ෦ ͷར༻ʹߜΔ • ઃఆΛڞ༗ग़དྷΔΑ͏ʹ͢Δ • มߋ͢ΔUIಉ͡ը໘ʹ࣋ͭ 28
ݕূͷվળ Case Study Find MyͰɺύʔςΟΫϧͷഎܠͷϒϥʔೱ ΛௐͰ͖Δػೳ͕ଘࡏ͍ͯͨ͠ɻ4 AirTag͕ͳͯ͘ɺݟ͚ͭΔ·ͰͷΞχϝʔγϣ ϯ͕ࣗಈ࠶ੜͰ͖Δɻ ࣮ػΛ͍ͭͭɺཧతͳ੍ΛऔΓͬͯ ϑΟʔϧͷτϥΠΞϯυΤϥʔΛࢼͤΔྑ͍ྫ
4 https://www.cultofmac.com/741835/enable-airtag- debug-mode/ 29
ݕূͷվળ Recap • σόοάϝχϡʔΛ׆༻ͯ͠ɺΞϓϦͰݕূΛ݁͢Δ͜ͱͰݕূ࣌ؒΛॖ͢ Δ • ख࡞ۀίϛϡχέʔγϣϯΛݮΒ͢ • ࠶Ϗϧυ࠶ΠϯετʔϧΛආ͚Δ •
ςελʔ͚ͷUXΛٻ͢Δ 30
ఆੑతͳҙݟͷ׆༻ͷ͠͞ ϥϯλΠϜσόοάUnitTestͱҟͳΓਓ͕ؒ৮ΔͷͰఆੑతͳҙݟ͕ಘΒΕΔɻ ໘ɺఆੑతͳҙݟ׆༻͕͍͠ - ʮͳΜ͔ؾ࣋ͪॏ͍ʯΛݕূ͢Δͷ͍͠ 31
ఆੑతͳҙݟͷ׆༻ͷ͠͞ νʔϜશମͰײ֮Λ߹ΘͤΔྗ্ͨ͠Ͱ… 1. ఆੑతͳҙݟͷཪ͚Λ͢Δ 2. ఆྔతͳࢦඪΛݟ͑ΔԽ͢Δ 32
ఆੑతͳҙݟͷ׆༻ͷ͠͞ ఆੑతͳҙݟͷཪ͚Λ͢Δ ཪ͚͕͋Δ͜ͱͰɺݕূίετ͕Լ͕Γνέοτ༗ҙٛͳͷʹ ʮॏ͍ɾ͍ʯͳͲɺఆੑతͳҙݟϩάΛݟ͔ͯΒͳ͍͜ͱ͕ଟ͍ɻ RPScreenRecorderΛ͏͜ͱͰૢ࡞ͷ15ඵલ·ͰΛه͢Δ͜ͱ͕Ͱ͖Δ 33
import ReplayKit // ىಈ͙ͯ͢͠ʹΫϦοϓͷόοϑΝϦϯάΛ։࢝͢Δ func launched() async throws { try
await RPScreenRecorder.shared().startClipBuffering() } ... // ҧײΛײͨ͡Β͙͢ʹΫϦοϓΛγΣΞͯ͠Β͏ɻ func onTapClipShareButton() async throws { let url: URL = URL(string: "")! try await RPScreenRecorder.shared().exportClip(to: url, duration: 5) try await RPScreenRecorder.shared().stopClipBuffering() shareVideo(url) } 34
ఆੑతͳҙݟͷ׆༻ͷ ͠͞ ఆྔతͳࢦඪΛݟ͑ΔԽ͢Δ શମͰܾΊ࣭ͨࢦඪΛՄࢹԽͯ͠ɺͷݟա ͝͠Λ͙ • FPS • •
όοςϦʔফඅ • ...etc 35
ఆੑతͳҙݟͷ׆༻ͷ͠͞ Recap • ϥϯλΠϜσόοάɺUnitTestͱҟͳΓఆੑతͳҙݟ͕ಘΒΕΔ • ఆੑతͳҙݟ׆༻͕͍͠ • ͜Ε·Ͱݕূͷ͔͕ͬͨ͠ɺΫϦοϓΛ͏͜ͱͰࣄ࣮ͱݟൺͳ͕Βղ ܾͰ͖Δ •
ఆྔతͳࢦඪΛݟ͑ΔԽ͢Δ • ςελʔͷײ֮ʹґଘ͠ͳ͍ମ੍ 36
noppefoxwolf/DebugMenuͷ հ 37
DebugMenu • noppefoxwolf/DebugMenu • ৗʹσόοάϝχϡʔͷϥϯνϟʔΛදࣔ͢Δ • ύϑΥʔϚϯεͷৗ࣌දࣔػೳ • SwiftUI /
UIKitରԠ • SPMରԠ 38
import DebugMenu func applaunched() { #if DEBUG DebugMenu.install(windowScene: windowScene, items:
[ ViewControllerDebugItem<ColorViewController>(), ClearCacheDebugItem(), UserDefaultsResetDebugItem(), CustomDebugItem() ], complication: [ CPUUsageComplication() ]) #endif } 39
ViewControllerDebugIte m ҙͷViewControllerΛݺͼग़͢ ViewControllerDebugItem<ColorViewController>( builder: { viewControllerType in viewControllerType.init(color: UIColor.blue)
} ) 40
UIܥDebugItem • ToggleDebugItem • SliderDebugItem 41
/* ΧελϜDebugItem */ struct CustomDebugItem: DebugItem { /// දࣔ͢ΔΞΠςϜ໊ let
debugItemTitle: String = "Custom item" /// let action: DebugItemAction = .didSelect { from, completion in ... completion(.success()) } } 42
μογϡϘʔυ • ը໘্ʹΦʔόʔϨΠ • ύϑΥʔϚϯεͷঢ়گΛදࣔ • ΧελϜՄೳ 43
ΫΠοΫΞΫηε • ΞϓϦใͷදࣔ • ΞΠςϜͷάϧʔϐϯά • ࣮ߦཤྺͷදࣔ • ΞΠςϜͷݕࡧ 44
Summary • ϥϯλΠϜσόοά… • ࣌ؒతɾۚમతʹίετ͕͔͔Δ • σόοάϝχϡʔʹΑΔ࡞ۀޮԽͰίετΛ͑Δ • ҰํͰUnitTestͰಘΒΕͳ͍ఆੑతͳҙݟ͕Ҿ͖ग़ͤΔ •
͔͠͠ఆੑతͳҙݟ׆༻͕͍͠ • ཪ͚ͱɺఆྔతͳࢦඪΛ࣋ͬͯ༗ޮʹ׆༻͢Δ • noppefoxwolf/DebugMenu 45