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

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

noppefoxwolf
September 19, 2021

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

noppefoxwolf

September 19, 2021
Tweet

More Decks by noppefoxwolf

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

  3. 3

    View Slide

  4. 4

    View Slide

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

    View Slide

  6. 6

    View Slide

  7. 7

    View Slide

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

    View Slide

  9. ର৅
    • ςελʔ
    • ΞϓϦΤϯδχΞ
    • QA୲౰ऀ
    • σβΠφʔ
    ...etc
    ※ ࣮ػσόοάΛਪ঑͢ΔηογϣϯͰ͸͋Γ·ͤΜɻ
    ࣮ػσόοάͤ͟Δಘͳ͍έʔεͱ͍͏લఏͰ͓ฉ͖͍ͩ͘͞ɻ
    9

    View Slide

  10. Ұൠతͳ։ൃϑϩʔ
    1. ίʔσΟϯάɾ࢓༷ࡦఆɾetc
    2. ίϯύΠϧ
    3. γϛϡϨʔλɾσόΠε࣮ߦɾϥΠϒϓϨϏϡʔ
    4. UnitTest
    5. ݁߹ςετ
    6. CI
    7. QA
    8. ϕʔλςετ
    9. ϦϦʔεςετ
    10. ຊ൪ςετ
    10

    View Slide

  11. ϥϯλΠϜσόοάͷಛ௃
    1. ਓ͕ؒख࡞ۀͰߦ͏࣌ؒతίετ
    • ≒ۚમతίετ
    • ≒ࣄۀϦεΫ
    2. ఆੑతͳҙݟͷ׆༻ͷ೉͠͞
    • ʮͳΜ͔ॏ͍ؾ͕͢ΔʯΛͲ͏ѻ͏͔
    11

    View Slide

  12. 1.࣌ؒతίετͷվળ
    12

    View Slide

  13. ݕূ଎౓ͷվળ
    ϥϯλΠϜσόοάͷϑϩʔ
    1. ίϯύΠϧ
    2. సૹ
    3. ؀ڥͷ֬ೝ
    4. ը໘·Ͱͷૢ࡞
    5. ಈ࡞ݕূ
    ͜ΕΒͷͲ͜ʹͲΜͳ͕͔͔͍࣌ؒͬͯΔͷ͔Λ஌Δඞཁ͕͋Δɻ
    13

    View Slide

  14. ݕূ଎౓ͷվળ
    3.؀ڥͷ֬ೝ
    • όʔδϣϯ൪߸ɺϏϧυ൪߸
    • ϩάΛݟΔ
    • OSͷόʔδϣϯɺϞσϧ
    • ઃఆΞϓϦ͔Βࢀর
    • Ϗϧυͷ࠷ऴ୲౰ऀ
    ...etc
    14

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  22. 22

    View Slide

  23. ݕূ଎౓ͷվળ
    4.ը໘·Ͱͷૢ࡞
    • ը໘ભҠ͕ଟ͍
    • ௨৴΍ॏ͍ॲཧ͕ڬ·Δ΄Ͳ͕͔͔࣌ؒΔ
    • ભҠ৚͕݅ݫ͍͠
    Hint
    • ىಈ͔ΒonAppear()΍viewDidAppear()·
    Ͱͷ࣌ؒΛܭଌ͢Δ
    23

    View Slide

  24. ݕূ଎౓ͷվળ
    4.ը໘·Ͱͷૢ࡞
    1. σόοάϝχϡʔ͔Β௚઀ඈ΂ΔΑ͏ʹ͢Δ
    2. URLεΩʔϜ͔Βىಈ͢Δ
    24

    View Slide

  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

    View Slide

  26. DEMO
    26

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  30. ݕূ଎౓ͷվળ
    Recap
    • σόοάϝχϡʔΛ׆༻ͯ͠ɺΞϓϦͰݕূΛ׬݁͢Δ͜ͱͰݕূ࣌ؒΛ୹ॖ͢
    Δ
    • ख࡞ۀ΍ίϛϡχέʔγϣϯΛݮΒ͢
    • ࠶Ϗϧυ΍࠶ΠϯετʔϧΛආ͚Δ
    • ςελʔ޲͚ͷUXΛ௥ٻ͢Δ
    30

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  35. ఆੑతͳҙݟͷ׆༻ͷ೉
    ͠͞
    ఆྔతͳࢦඪΛݟ͑ΔԽ͢Δ
    શମͰܾΊͨ඼࣭ࢦඪΛՄࢹԽͯ͠ɺ໰୊ͷݟա
    ͝͠Λ๷͙
    • FPS
    • ೤
    • όοςϦʔফඅ
    • ...etc
    35

    View Slide

  36. ఆੑతͳҙݟͷ׆༻ͷ೉͠͞
    Recap
    • ϥϯλΠϜσόοά͸ɺUnitTestͱҟͳΓఆੑతͳҙݟ͕ಘΒΕΔ
    • ఆੑతͳҙݟ͸׆༻͕೉͍͠
    • ͜Ε·Ͱݕূͷ೉͔͕ͬͨ͠ɺΫϦοϓΛ࢖͏͜ͱͰࣄ࣮ͱݟൺ΂ͳ͕Βղ
    ܾͰ͖Δ
    • ఆྔతͳࢦඪΛݟ͑ΔԽ͢Δ
    • ςελʔͷײ֮ʹґଘ͠ͳ͍ମ੍
    36

    View Slide

  37. noppefoxwolf/DebugMenuͷ঺
    հ
    37

    View Slide

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

    View Slide

  39. import DebugMenu
    func applaunched() {
    #if DEBUG
    DebugMenu.install(windowScene: windowScene, items: [
    ViewControllerDebugItem(),
    ClearCacheDebugItem(),
    UserDefaultsResetDebugItem(),
    CustomDebugItem()
    ], complication: [
    CPUUsageComplication()
    ])
    #endif
    }
    39

    View Slide

  40. ViewControllerDebugIte
    m
    ೚ҙͷViewControllerΛ௚઀ݺͼग़͢
    ViewControllerDebugItem(
    builder: { viewControllerType in
    viewControllerType.init(color: UIColor.blue)
    }
    )
    40

    View Slide

  41. UIܥDebugItem
    • ToggleDebugItem
    • SliderDebugItem
    41

    View Slide

  42. /*
    ΧελϜDebugItem
    */
    struct CustomDebugItem: DebugItem {
    /// දࣔ͢ΔΞΠςϜ໊
    let debugItemTitle: String = "Custom item"
    ///
    let action: DebugItemAction = .didSelect { from, completion in
    ...
    completion(.success())
    }
    }
    42

    View Slide

  43. μογϡϘʔυ
    • ը໘্ʹΦʔόʔϨΠ
    • ύϑΥʔϚϯεͷঢ়گΛදࣔ
    • ΧελϜՄೳ
    43

    View Slide

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

    View Slide

  45. Summary
    • ϥϯλΠϜσόοά͸…
    • ࣌ؒతɾۚમతʹίετ͕͔͔Δ
    • σόοάϝχϡʔʹΑΔ࡞ۀޮ཰ԽͰίετΛ཈͑Δ
    • ҰํͰUnitTestͰ͸ಘΒΕͳ͍ఆੑతͳҙݟ͕Ҿ͖ग़ͤΔ
    • ͔͠͠ఆੑతͳҙݟ͸׆༻͕೉͍͠
    • ཪ෇͚ͱɺఆྔతͳࢦඪΛ࣋ͬͯ༗ޮʹ׆༻͢Δ
    • noppefoxwolf/DebugMenu
    45

    View Slide