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
ランタイムデバッグのススメ/iOSDC21
Search
noppefoxwolf
September 19, 2021
Technology
5.8k
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
柔軟性のあるUIで、多くの環境でアプリを活躍させる/iOSDC26
noppefoxwolf
0
1.3k
High performance GIF playback/iOSDC25
noppefoxwolf
1
680
Spice up your notifications/try!Swift25
noppefoxwolf
3
860
iOSの隠されたAPIを解明し、開発効率を向上させる方法/iOSDC24
noppefoxwolf
2
1.5k
今から理解するApp Intentエコシステム/WWDC24Recap
noppefoxwolf
0
80
既存アプリをvisionOS対応してリリースした話/visionOS LT vol5
noppefoxwolf
0
230
UIのブラックボックスを探る/iOSDC23
noppefoxwolf
3
5.2k
CoreGraphicsでドット絵を描こう/iOSDC22
noppefoxwolf
0
3.3k
google/mediapipe で始めるARアプリ開発/iOSDC2020
noppefoxwolf
1
1.8k
Other Decks in Technology
See All in Technology
20260930_Gemma4_Hands-on
tsho
0
190
Claude起点の仕様駆動開発
tanakaseiya
0
250
形式手法を使って仕様をコーディングしよう
mikanichinose
0
160
サーバーフルコンピューティング?AWS Lambda
iwatatomoya
0
100
オブザーバビリティを高める AI エージェント体験を考える / Designing AI Agent Experiences That Enhance Observability
aoto
PRO
1
110
【Findyテック文化祭ワークショップ】新卒エンジニア&採用担当と作る、 なりたい姿と今やるべき一歩
dip_tech
PRO
0
150
ビジネスを止めない技術的負債の返済のための戦略とその手法 - 技術的負債と向き合う / Complexity and Simplicity
soudai
PRO
2
300
GitHub Agentic Workflows を触ってみる
htkym
2
900
The kernel report
ennael
PRO
1
170
Apache Iceberg が拓く AI 時代のオープンレイクハウス
tomtanaka
0
200
認知負荷を吸収し、プロダクトをまたぐPR Preview基盤の設計事例
taiki45
2
560
Lambda MicroVMsが分からなすぎたので使い所を1から考えてみた
tsukuboshi
1
270
Featured
See All Featured
Designing for Performance
lara
611
70k
Google's AI Overviews - The New Search
badams
0
1.6k
How Software Deployment tools have changed in the past 20 years
geshan
2
34k
sira's awesome portfolio website redesign presentation
elsirapls
0
430
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
We Are The Robots
honzajavorek
0
380
Amusing Abliteration
ianozsvald
1
320
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
270
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
420
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3.1k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
390
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