Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ランタイムデバッグのススメ/iOSDC21

3e66b3ccfa617b78c59d9dec865aa29f?s=47 noppefoxwolf
September 19, 2021

 ランタイムデバッグのススメ/iOSDC21

3e66b3ccfa617b78c59d9dec865aa29f?s=128

noppefoxwolf

September 19, 2021
Tweet

Transcript

  1. ϥϯλΠϜσόοάͷεεϝ iOSDC2021 TrackA Day2 noppe / iOS app developer 1

  2. noppe - noppefoxwolf • גࣜձࣾσΟʔɾΤψɾΤʔ • ιʔγϟϧϥΠϒPococha • ݸਓΞϓϦ։ൃ •

    όʔνϟϧࣗࡱΓΞϓϦvear 2
  3. 3

  4. 4

  5. • ऩ࿥ͷ2िؒલʹࢠڙ͕࢈·Ε·ͨ͠ • ऩ࿥தʹٽ͖࢝ΊͨΒ΍Γ௚͠ʹͳΓ·͢ 5

  6. 6

  7. 7

  8. ଘࡏ͠ͳ͍୯ޠͳͷͰ… ఆٛ ࣮ߦதͷΞϓϦͰɺσόοάΛ͢Δ͜ͱ1 ≒ ࣮ػςετ ͱ͠·͢ɻ 1 ͜ͷηογϣϯͷதͰͷఆٛ

  9. ର৅ • ςελʔ • ΞϓϦΤϯδχΞ • QA୲౰ऀ • σβΠφʔ ...etc

    ※ ࣮ػσόοάΛਪ঑͢ΔηογϣϯͰ͸͋Γ·ͤΜɻ ࣮ػσόοάͤ͟Δಘͳ͍έʔεͱ͍͏લఏͰ͓ฉ͖͍ͩ͘͞ɻ 9
  10. Ұൠతͳ։ൃϑϩʔ 1. ίʔσΟϯάɾ࢓༷ࡦఆɾetc 2. ίϯύΠϧ 3. γϛϡϨʔλɾσόΠε࣮ߦɾϥΠϒϓϨϏϡʔ 4. UnitTest 5.

    ݁߹ςετ 6. CI 7. QA 8. ϕʔλςετ 9. ϦϦʔεςετ 10. ຊ൪ςετ 10
  11. ϥϯλΠϜσόοάͷಛ௃ 1. ਓ͕ؒख࡞ۀͰߦ͏࣌ؒతίετ • ≒ۚમతίετ • ≒ࣄۀϦεΫ 2. ఆੑతͳҙݟͷ׆༻ͷ೉͠͞ •

    ʮͳΜ͔ॏ͍ؾ͕͢ΔʯΛͲ͏ѻ͏͔ 11
  12. 1.࣌ؒతίετͷվળ 12

  13. ݕূ଎౓ͷվળ ϥϯλΠϜσόοάͷϑϩʔ 1. ίϯύΠϧ 2. సૹ 3. ؀ڥͷ֬ೝ 4. ը໘·Ͱͷૢ࡞

    5. ಈ࡞ݕূ ͜ΕΒͷͲ͜ʹͲΜͳ͕͔͔͍࣌ؒͬͯΔͷ͔Λ஌Δඞཁ͕͋Δɻ 13
  14. ݕূ଎౓ͷվળ 3.؀ڥͷ֬ೝ • όʔδϣϯ൪߸ɺϏϧυ൪߸ • ϩάΛݟΔ • OSͷόʔδϣϯɺϞσϧ • ઃఆΞϓϦ͔Βࢀর

    • Ϗϧυͷ࠷ऴ୲౰ऀ ...etc 14
  15. 3.؀ڥͷ֬ೝ A. ΞϓϦͷதͰݟΕΔΑ͏ʹ͠ɺૢ࡞Λল͘ • ͳΜͰ΋͔ΜͰ΋දࣔͤͣɺඞཁͳ৘ใ͔ݟۃ ΊΔ • ߲໨͸ςελʔʹώΞϦϯά • ֬ೝʹίϛϡχέʔγϣϯ͕ඞཁͳ΋ͷ͕

    ͳ͍͔ • ख࡞ۀʹΑΔૢ࡞͕ඞཁͳ΋ͷ͕ͳ͍͔ 15
  16. σόοάϝχϡʔ • ςελʔ޲͚ͷಛघͳը໘ • ඇΤϯδχΞ2ʹͱͬͯɺඇৗʹڧྗͳଘࡏ 2 ࣮૷ͷมߋ͕ग़དྷͳ͍ςελʔ

  17. σόοάϝχϡʔͷ࣮૷ 1. ద౰ͳը໘Λ༻ҙ͢Δ 2. ຊ൪Ͱݺ΂ͳ͍Α͏ʹ͢Δ 17

  18. σόοάϝχϡʔͷ࣮૷ 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
  19. σόοάϝχϡʔͷ࣮૷ ։ൃ༻ػೳΛϞδϡʔϧԽ͠ɺ҆શʹ෼཭͢Δʹ͸ Swift Packageத৺ͷϓϩδΣΫτߏ੒ ͱͦͷ࣮ફ Day2 TrackC 14:50 େن໛ͳΞϓϦͷϚϧνϞδϡʔϧߏ ੒ͷ࣮ફ

    Day2 TrackA 11:30 19
  20. ݕূ଎౓ͷվળ 3.؀ڥͷ֬ೝ ࠶Ϗϧυɾ࠶ΠϯετʔϧΛ൐͏؀ڥ • ઀ଓઌαʔόʔͷઃఆ • νϡʔτϦΞϧදࣔͷϦηοτ • Ωϟογϡͷ࡟আ 20

  21. ݕূ଎౓ͷվળ 3.؀ڥͷ֬ೝ ࠶Ϗϧυɾ࠶ΠϯετʔϧΛ൐͏؀ڥ͸… σόοάϝχϡʔ͔Βઃఆɾ࣮ߦͰ͖ΔΑ͏ʹ͢ Δ 21

  22. 22

  23. ݕূ଎౓ͷվળ 4.ը໘·Ͱͷૢ࡞ • ը໘ભҠ͕ଟ͍ • ௨৴΍ॏ͍ॲཧ͕ڬ·Δ΄Ͳ͕͔͔࣌ؒΔ • ભҠ৚͕݅ݫ͍͠ Hint •

    ىಈ͔ΒonAppear()΍viewDidAppear()· Ͱͷ࣌ؒΛܭଌ͢Δ 23
  24. ݕূ଎౓ͷվળ 4.ը໘·Ͱͷૢ࡞ 1. σόοάϝχϡʔ͔Β௚઀ඈ΂ΔΑ͏ʹ͢Δ 2. URLεΩʔϜ͔Βىಈ͢Δ 24

  25. 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
  26. DEMO 26

  27. ݕূ଎౓ͷվળ 5.ಈ࡞ݕূ • ࣌୹͠೉͍Օॴ • ϑΟʔϧʢମײʣͷݕূ͸վળͷ༨஍͋Γ • ΞχϝʔγϣϯɾδΣενϟʔɾײ֮ϑΟʔυόοΫ • ඍௐ੔͕ଟ͘ɺ࠶Ϗϧυ΋ଟ͍

    27
  28. ݕূ଎౓ͷվળ ύϥϝʔλͷௐ੔͸࣮ߦதʹग़དྷΔΑ͏ʹ͢Δ • ࣮૷ίετ͕͔͔ΔͷͰɺΞϓϦͷίΞͷ෦෼ ͷར༻ʹߜΔ • ઃఆ஋Λڞ༗ग़དྷΔΑ͏ʹ͢Δ • มߋ͢ΔUI͸ಉ͡ը໘಺ʹ࣋ͭ 28

  29. ݕূ଎౓ͷվળ Case Study Find MyͰ͸ɺύʔςΟΫϧͷ਺΍എܠͷϒϥʔೱ ౓Λௐ੔Ͱ͖Δػೳ͕ଘࡏ͍ͯͨ͠ɻ4 AirTag͕ͳͯ͘΋ɺݟ͚ͭΔ·ͰͷΞχϝʔγϣ ϯ͕ࣗಈ࠶ੜͰ͖Δɻ ࣮ػΛ࢖͍ͭͭɺ෺ཧతͳ੍໿ΛऔΓ෷ͬͯ ϑΟʔϧͷτϥΠΞϯυΤϥʔΛࢼͤΔྑ͍ྫ

    4 https://www.cultofmac.com/741835/enable-airtag- debug-mode/ 29
  30. ݕূ଎౓ͷվળ Recap • σόοάϝχϡʔΛ׆༻ͯ͠ɺΞϓϦͰݕূΛ׬݁͢Δ͜ͱͰݕূ࣌ؒΛ୹ॖ͢ Δ • ख࡞ۀ΍ίϛϡχέʔγϣϯΛݮΒ͢ • ࠶Ϗϧυ΍࠶ΠϯετʔϧΛආ͚Δ •

    ςελʔ޲͚ͷUXΛ௥ٻ͢Δ 30
  31. ఆੑతͳҙݟͷ׆༻ͷ೉͠͞ ϥϯλΠϜσόοά͸UnitTestͱҟͳΓਓ͕ؒ৮ΔͷͰఆੑతͳҙݟ͕ಘΒΕΔɻ ൓໘ɺఆੑతͳҙݟ͸׆༻͕೉͍͠ - ʮͳΜ͔ؾ࣋ͪॏ͍ʯΛݕূ͢Δͷ͸೉͍͠ 31

  32. ఆੑతͳҙݟͷ׆༻ͷ೉͠͞ νʔϜશମͰײ֮Λ߹ΘͤΔ౒ྗ͸্ͨ͠Ͱ… 1. ఆੑతͳҙݟͷཪ෇͚Λ͢Δ 2. ఆྔతͳࢦඪΛݟ͑ΔԽ͢Δ 32

  33. ఆੑతͳҙݟͷ׆༻ͷ೉͠͞ ఆੑతͳҙݟͷཪ෇͚Λ͢Δ ཪ෇͚͕͋Δ͜ͱͰɺݕূίετ͕Լ͕Γνέοτ͸༗ҙٛͳ΋ͷʹ ʮॏ͍ɾ஗͍ʯͳͲɺఆੑతͳҙݟ͸ϩάΛݟͯ΋෼͔Βͳ͍͜ͱ͕ଟ͍ɻ RPScreenRecorderΛ࢖͏͜ͱͰૢ࡞ͷ15ඵલ·ͰΛه࿥͢Δ͜ͱ͕Ͱ͖Δ 33

  34. 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
  35. ఆੑతͳҙݟͷ׆༻ͷ೉ ͠͞ ఆྔతͳࢦඪΛݟ͑ΔԽ͢Δ શମͰܾΊͨ඼࣭ࢦඪΛՄࢹԽͯ͠ɺ໰୊ͷݟա ͝͠Λ๷͙ • FPS • ೤ •

    όοςϦʔফඅ • ...etc 35
  36. ఆੑతͳҙݟͷ׆༻ͷ೉͠͞ Recap • ϥϯλΠϜσόοά͸ɺUnitTestͱҟͳΓఆੑతͳҙݟ͕ಘΒΕΔ • ఆੑతͳҙݟ͸׆༻͕೉͍͠ • ͜Ε·Ͱݕূͷ೉͔͕ͬͨ͠ɺΫϦοϓΛ࢖͏͜ͱͰࣄ࣮ͱݟൺ΂ͳ͕Βղ ܾͰ͖Δ •

    ఆྔతͳࢦඪΛݟ͑ΔԽ͢Δ • ςελʔͷײ֮ʹґଘ͠ͳ͍ମ੍ 36
  37. noppefoxwolf/DebugMenuͷ঺ հ 37

  38. DebugMenu • noppefoxwolf/DebugMenu • ৗʹσόοάϝχϡʔͷϥϯνϟʔΛදࣔ͢Δ • ύϑΥʔϚϯεͷৗ࣌දࣔػೳ • SwiftUI /

    UIKitରԠ • SPMରԠ 38
  39. import DebugMenu func applaunched() { #if DEBUG DebugMenu.install(windowScene: windowScene, items:

    [ ViewControllerDebugItem<ColorViewController>(), ClearCacheDebugItem(), UserDefaultsResetDebugItem(), CustomDebugItem() ], complication: [ CPUUsageComplication() ]) #endif } 39
  40. ViewControllerDebugIte m ೚ҙͷViewControllerΛ௚઀ݺͼग़͢ ViewControllerDebugItem<ColorViewController>( builder: { viewControllerType in viewControllerType.init(color: UIColor.blue)

    } ) 40
  41. UIܥDebugItem • ToggleDebugItem • SliderDebugItem 41

  42. /* ΧελϜDebugItem */ struct CustomDebugItem: DebugItem { /// දࣔ͢ΔΞΠςϜ໊ let

    debugItemTitle: String = "Custom item" /// let action: DebugItemAction = .didSelect { from, completion in ... completion(.success()) } } 42
  43. μογϡϘʔυ • ը໘্ʹΦʔόʔϨΠ • ύϑΥʔϚϯεͷঢ়گΛදࣔ • ΧελϜՄೳ 43

  44. ΫΠοΫΞΫηε • ΞϓϦ৘ใͷදࣔ • ΞΠςϜͷάϧʔϐϯά • ࣮ߦཤྺͷදࣔ • ΞΠςϜͷݕࡧ 44

  45. Summary • ϥϯλΠϜσόοά͸… • ࣌ؒతɾۚમతʹίετ͕͔͔Δ • σόοάϝχϡʔʹΑΔ࡞ۀޮ཰ԽͰίετΛ཈͑Δ • ҰํͰUnitTestͰ͸ಘΒΕͳ͍ఆੑతͳҙݟ͕Ҿ͖ग़ͤΔ •

    ͔͠͠ఆੑతͳҙݟ͸׆༻͕೉͍͠ • ཪ෇͚ͱɺఆྔతͳࢦඪΛ࣋ͬͯ༗ޮʹ׆༻͢Δ • noppefoxwolf/DebugMenu 45