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

iOSアプリ開発もLLMで自動運転する

 iOSアプリ開発もLLMで自動運転する

potatotips #91

Avatar for Yuya Hirayama

Yuya Hirayama

May 27, 2025
Tweet

More Decks by Yuya Hirayama

Other Decks in Programming

Transcript

  1. ୭ • @hiragram • akippa Inc. iOS App Developer •

    Claude Max/ChatGPT Plus/ NotebookLM Plus/Devin Core/ GitHub Copilot Pro 2
  2. • ʮཁ݅ఆٛʹ෇͖߹ͬͯʯ • ·ͣϓϩδΣΫτΛͬ͘͟Γ೺ Ѳͤ͞Δ > ཁ݅ఆٛʹ෇͖߹ͬͯ͘Ε·͔͢ɻ ⏺ ΋ͪΖΜͰ͢ɻͲͷΑ͏ͳػೳ΍վળΛ ݕ౼͞Ε͍ͯ·͔͢ʁ

    > ·ͣ͸͜ͷΞϓϦͷ֓ཁΛͬ͘͟Γཧղ ͯ͠΋Βͬͯ΋͍͍ʁϓϩδΣΫτΛ Ұ௨ΓோΊͯΈ͍ͯͩ͘͞ɻ ⏺ ϓϩδΣΫτͷ֓ཁΛཧղ͢ΔͨΊʹɺ ओཁͳϑΝΠϧΛ֬ೝ͍͖ͯ͠·͢ɻ 10
  3. • ओͳػೳɺٕज़ߏ੒ɺσʔλߏ ଄ͳͲΛ೺Ѳͯ͠΋Β͏ ⏺ ΞϓϦ֓ཁ ʮSetoriʯ͸ɺΧϥΦέ༻ͷηοτϦετ؅ཧΞϓϦͰ͢ɻ ओͳػೳ 1. ηοτϦετ؅ཧ -

    ෳ਺ͷηοτϦετΛ࡞੒ɾ؅ཧ 2. Apple Music࿈ܞ - Apple Music͔Βָۂ৘ใΛݕࡧɾऔಘ 3. ָۂ؅ཧ - ָ֤ۂͷ࠷ߴείΞɺΩʔมߋɺϝϞͳͲΧϥΦέಛ༗ͷ৘ใΛه࿥ 4. ଟݴޠରԠ - ָۂ৘ใΛݱࡏͷϩέʔϧʹ߹Θͤͯදࣔʢ೔ຊޠ/ӳޠͳͲʣ 5. Share Extension - Apple MusicΞϓϦ͔Β௚઀ָۂΛηοτϦετʹ௥Ճ ٕज़ߏ੒ - SwiftUI - UIߏங - SwiftData - σʔλӬଓԽʢ@Modelɺଟରଟͷؔ܎؅ཧʣ - MusicKit - Apple Music࿈ܞ - Observation - ঢ়ଶ؅ཧʢ@Observableʣ - Swift Package Manager - AppCoreύοέʔδͰίΞϩδοΫΛ෼཭ σʔλϞσϧ - Song - ָۂ৘ใ - Apple Music ID - λΠτϧ - ΞʔςΟετ - ΧϥΦέؔ࿈৘ใ - SongList - ηοτϦετ - SongToList - ଟରଟͷؔ܎Λ؅ཧ͢Δதؒςʔϒϧ 11
  4. • ͜Ε͔Β࡞Γ͍ͨ΋ͷʹ͍ͭͯ ࡶʹ఻͑Δ > ͜Εʹ৽ػೳΛ௥Ճ͢Δɻ ҰॹʹΧϥΦέʹདྷͨਓಉ࢜ͰۂϦετΛڞ༗ͯ͠ɺ ଞͷਓͷϦετΛΈͯͦͷਓʹՎͬͯ΄͍͠ՎΛબ ΜͰϦΫΤετΛૹΕΔΑ͏ʹ͢ΔɻMultipeer Connectivityͷར༻Λݕ౼͍ͯ͠Δɻ ⏺

    ໘ന͍ػೳͰ͢ͶʂMultipeerConnectivityΛ ࢖ͬͨۙڑ཭ͰͷϦΞϧλΠϜڞ༗ػೳͷཁ݅Λ ੔ཧ͠·͠ΐ͏ɻ ⏺ Update Todos 㽾 ☐ MultipeerConnectivityػೳͷཁ݅ఆٛ ☐ ඞཁͳϞσϧͱαʔϏεͷઃܭ ☐ UIϑϩʔͷઃܭ 12
  5. • ॳखͰ͜Ε͚ͩͷ৘ใΛ଍ͯ͠ ͘ΕΔ • ͜ͷઌͷٞ࿦ͷ͖ͨͨ୆ͱͯ͠ ͸े෼͗͢Δ৘ใྔ • ػೳཁ݅ɺٕज़తͳߟྀࣄ߲ɺ αϯϓϧίʔυɺUI/UXͷ֓ཁ ⏺

    ৽ػೳͷཁ݅ఆٛ ػೳ֓ཁ ΧϥΦέϘοΫεͰҰॹʹ͍Δਓಉ͕࢜ϦΞϧλΠϜͰۂϦετΛڞ༗͠ɺϦΫΤετΛૹΓ߹ ͑Δػೳɻ ओͳػೳཁ݅ 1. ηογϣϯ؅ཧ - ϗετػೳ: ෦԰Λ࡞੒ͯ͠ηογϣϯΛ։࢝ - ήετػೳ: ۙ͘ͷηογϣϯΛ୳ͯ͠ࢀՃ - ࣗಈ੾அ: ΞϓϦऴྃ࣌΍όοΫάϥ΢ϯυҠߦ࣌ͷॲཧ 2. σʔλڞ༗ - Ϧετڞ༗: બ୒ͨ͠ηοτϦετΛࢀՃऀͱڞ༗ - ϓϩϑΟʔϧ: χοΫωʔϜ΍Ξόλʔ৭ͷઃఆ - ϦΞϧλΠϜಉظ: ۂͷ௥Ճɾ࡟আ͕ଈ࠲ʹ൓ө 3. ϦΫΤετػೳ - ۂϦΫΤετ: ଞͷਓͷϦετ͔ΒۂΛબΜͰϦΫΤετૹ৴ - ϦΫΤετड৴: ௨஌ͱϦΫΤετҰཡදࣔ - εςʔλε؅ཧ: ঝೝ/٫Լ/อཹͷঢ়ଶ؅ཧ 4. ηΩϡϦςΟɾϓϥΠόγʔ - ڞ༗ൣғ੍ޚ: ͲͷϦετΛڞ༗͢Δ͔બ୒Մೳ - ηογϣϯೝূ: ෦԰ίʔυ΍QRίʔυͰͷࢀՃ੍ݶ - Ұ࣌తͳڞ༗: ηογϣϯऴྃޙ͸σʔλ͕࢒Βͳ͍ ٕज़తͳߟྀࣄ߲ MultipeerConnectivity - MCSession: ηογϣϯ؅ཧ - MCNearbyServiceBrowser: ۙ͘ͷηογϣϯΛ୳͢ - MCNearbyServiceAdvertiser: ηογϣϯΛެ։ - σʔλܗࣜ: CodableΛ࢖༻ͨ͠JSON௨৴ σʔλϞσϧ֦ு // ηογϣϯࢀՃऀ struct SessionParticipant { let peerID: MCPeerID let nickname: String let avatarColor: String let sharedLists: [SongList] } // ϦΫΤετ struct SongRequest { let id: UUID let fromPeerID: MCPeerID let toPeerID: MCPeerID let song: Song let message: String? let status: RequestStatus let createdAt: Date } enum RequestStatus { case pending case accepted case declined } UI/UXϑϩʔ 1. ηογϣϯ։࢝ը໘ - ʮ෦԰Λ࡞Δʯʮ෦԰ʹࢀՃʯͷબ୒ - χοΫωʔϜઃఆ 2. ࢀՃऀҰཡը໘ - ઀ଓதͷࢀՃऀϦετ - ֤ࢀՃऀͷڞ༗Ϧετ਺දࣔ 3. ଞऀͷϦετӾཡը໘ - ࢀՃऀͷηοτϦετදࣔ - ۂΛλοϓͯ͠ϦΫΤετૹ৴ 4. ϦΫΤετ؅ཧը໘ - ड৴ͨ͠ϦΫΤετҰཡ - ૹ৴ͨ͠ϦΫΤετҰཡ - εςʔλεߋ৽ Ͳͷ෦෼͔Βৄࡉʹઃܭ͍͖ͯ͠·͠ΐ͏͔ʁ 13
  6. • λʔϛφϧͰผͷClaudeΛཱͪ ্͛ͯɺ • ʮ͋ͳͨ͸ઃܭ୲౰ऀʯ • ʮ·ͣཁ݅Λݟͯ௥ՃͰඞ ཁͳ৘ใΛચ͍ग़͠·͠ΐ ͏ʯ •

    Ұ໰Ұ౴Ͱઃܭʹඞཁͳ৘ใΛ ิ׬͍ͯ͘͠ > ͋ͳͨʹ͸issue #37 ͷઃܭΛ୲౰͍͖ͯͨͩ͠ ·͢ɻ ͍͖ͳΓ࣮૷ʹೖΔલʹɺཁ݅ʹψέϞϨ͕ͳ͍͔ Λ֬ೝ͠·͠ΐ͏ɻissueͷ಺༰ΛಡΜͰཧղͯ͠ ͍ͩ͘͞ɻ ⏺ ྃղ͠·ͨ͠ɻissue #37ͷ಺༰Λ֬ೝ͍ͤͯͨ͞ ͖ͩ·͢ɻ ⏺ issue #37ͷ಺༰Λ֬ೝ͠·ͨ͠ɻཁ݅Λ੔ཧ͠ɺ ࣮૷લʹ֬ೝ͢΂͖఺Λચ͍ग़͠·͢ɻ > ໌Β͔ʹ͠ͳ͍ͱ͍͚ͳ͍͜ͱʹ͍ͭͯɺ1ͭͣͭ ࣭໰ͯ͘͠Ε·͔͢ʁ౴͑·͢ɻ ⏺ ͸͍ɺͦΕͰ͸1ͭͣͭ֬ೝ͍͖ͤͯͨͩ͞·͢ɻ ࣭໰1: SongϞσϧͷγϦΞϥΠζํ๏ʹ͍ͭͯ ݱࡏͷSongϞσϧ͸@ModelϚΫϩΛ࢖༻͓ͯ͠Γ CodableͰ͸ͳ͍ͨΊɺMultipeerConnectivity ͰσʔλΛૹ৴͢ΔࡍʹγϦΞϥΠζͰ͖·ͤΜɻ ҎԼͷͲͪΒͷํ๏Ͱ࣮૷͢΂͖Ͱ͠ΐ͏͔ʁ A) ܰྔͳCodableߏ଄ମΛ࡞੒͢ΔҊ struct SongData: Codable { ... 18
  7. 20

  8. • λʔϛφϧͰผͷClaudeΛཱͪ ্͛ͯɺ • ʮ͋ͳͨ͸࣮૷୲౰ऀʯ • ʮదٓXcodeBuildMCPΛ࢖ ͬͯΞϓϦΛϏϧυͯ͠Τϥ ʔΛ௚͠ͳ͕ΒਐΊΔʯ •

    ʮཁ͕݅ᐆດͩͬͨΓͯ͠ ࠔͬͨΒࢲʹฉ͍ͯʯ > issue #37 ͷ࣮૷Λ୲౰͍͖ͯͨͩ͠·͢ɻͦ͜ ʹॻ͍ͯ͋Δ͜ͱΛΑ͘ಡΜͰཧղ͍ͯͩ͘͠͞ɻ ·ͨɺͳΔ΂ͦ͘ΕΒͷཁ݅Λ୲อ͢ΔϢχοτς ετΛॻ͍͍ͯͩ͘͞ɻxcodebuild mcpΛ࢖ͬͯ ɺఆظతʹϏϧυΛࢼ͠ɺࣦഊͨ͠৔߹͸ඞཁͳम ਖ਼Λࢪ͍ͯͩ͘͠͞ɻ࣮૷தɺཁ͕݅ᐆດͩͬͨΓ ͯ͠ϓϩμΫτΦʔφʔͰ͋Δࢲʹ֬ೝͨ͠΄͏͕ ͍͍ͱײ͡Δ͜ͱ͸ɺԕྀͳ͘ฉ͍ͯԼ͍͞ɻͦΕ Ͱ͸࣮૷Λ࢝Ί͍ͯͩ͘͞ɻ ⏺ ྃղ͠·ͨ͠ɻ ·ͣɺissue #37ͷ಺༰Λ֬ೝ͍ͤͯͩ͘͞͞ɻ ⏺ Issue #37ͷ಺༰Λ֬ೝ͠·ͨ͠ɻΧϥΦέηογ ϣϯػೳͷ࣮૷Ͱ͢Ͷɻ͔ͳΓେن໛ͳػೳͳͷͰɺ λεΫΛ੔ཧͯ͠ਐΊ͍͖ͤͯͨͩ͞·͢ɻ ⏺ Update Todos 㽾 ☐ MultipeerConnectivityΛ࢖༻ͨ͠ηογϣϯ؅ཧΫϥεͷ࣮૷ ☐ σʔλϞσϧʢSessionConfigɺ SessionParticipantɺSongRequestɺ SessionMessageʣͷ࣮૷ ☐ Ϣχοτςετͷ࡞੒ ☐ ηογϣϯ։࢝ը໘ʢχοΫωʔϜೖྗɺ෦԰࡞੒/ࢀՃબ୒ʣͷ࣮૷ ☐ ϗετը໘ʢύείʔυදࣔɺࢀՃऀҰཡʣͷ࣮૷ ☐ ήετը໘ʢύείʔυೖྗʣͷ࣮૷ ☐ ηογϣϯϝΠϯը໘ʢϦΫΤετܝࣔ൘λϒɺࢀՃऀλϒʣͷ࣮૷ ☐ ڞ༗Ϧετઃఆػೳͷ࣮૷ ☐ ଞऀͷϦετӾཡɾϦΫΤετૹ৴ػೳͷ࣮૷ ☐ ContentView΁ͷΤϯτϦʔϙΠϯτ௥Ճ ☐ ௨஌ػೳʢα΢ϯυɾόΠϒϨʔγϣϯʣͷ࣮૷ ☐ όοΫάϥ΢ϯυରԠɾࣗಈ࠶઀ଓػೳͷ࣮૷ 22
  9. • ࣮૷Λ࢝Ί͔ͯΒ7෼ɺಉ͡ͱ ͜ΖΛΨνϟΨνϟ܁Γฦ͍͠ ͬͯ͡͸Τϥʔɺ͍ͬͯ͡͸Τ ϥʔΛ܁Γฦ͍ͯͨ͠ɻ • ʮԿ౓΋΍ͬͯ͏·͍͔͘ͳ͔ ͬͨΒ૬ஊͯ͠Ͷʯ • SendableͳΫϩʔδϟपΓͰ᪴

    ͍͍ͯͨͷͰ੠Λ͔͚ͨɻ > 1ͭͷ໰୊ʹԿ౓΋Կ౓΋मਖ਼ͯ͠΋͏·͍͔͘ ͳ͍ͳʔͱࢥͬͨΒ๻ʹ૬ஊͯ͠Ͷ ⏺ ਃ͠༁͍͟͝·ͤΜɻSendableͷ໰୊ͰԿ౓΋ ಉ͡Τϥʔ͕ൃੜ͍ͯ͠·͢Ͷɻ ͜ͷ໰୊͸ɺSwift 6ͷconcurrencyϞʔυͰ SessionServiceΫϥε͕Sendableϓϩτίϧ ʹ४ڌ͍ͯ͠ͳ͍͜ͱ͕ݪҼͰ͢ɻ Timer.scheduledTimerͷΫϩʔδϟ಺Ͱself ΛΩϟϓνϟ͍ͯ͠ΔͨΊɺΤϥʔ͕ൃੜ͍ͯ͠· ͢ɻ ͍͔ͭ͘ͷղܾࡦ͕͋Γ·͢ɿ 1. SessionServiceΛactorԽ͢Δʢਪ঑ʣ 2. @uncheckedΛ࢖༻ͯ͠Sendableʹ४ڌͤ͞Δ 3. TimerҎ֎ͷํ๏ʢTask.sleepʣΛ࢖༻͢Δ ͲͷΞϓϩʔν͕Α͍Ͱ͠ΐ͏͔ʁݸਓతʹ͸ɺ SessionServiceΛactorʹ͢Δ͜ͱͰɺฒߦॲཧ ͷ҆શੑΛอূͭͭ͠ɺ͜ͷ໰୊ΛղܾͰ͖Δͱࢥ͍ ·͢ɻͨͩ͠ɺͦͷ৔߹͸ଟ͘ͷϝιου͕asyncʹ ͳΔՄೳੑ͕͋Γ·͢ɻ ͲͪΒͷํ޲ੑͰਐΊΔ΂͖͔ɺ͝ҙݟΛ͓ฉ͔͍ͤͩ͘͞ɻ 23
  10. • ͦͷޙ͸Կ౓͔࣭໰͞Εͳ͕Β ΋ॱௐʹ࣮૷͕ਐΈ… • Ϣχοτςετ΋ద౓ʹॻ͖ͭ ͭ׬ྃɻςετ΋׬૸ɻ • ਓͷखͰίϛοτͯ͠PR࡞ͬ ࣮ͯ૷͓ΘΓɻ ⏺

    ࣮૷׬ྃʂ Issue #37ͷΧϥΦέηογϣϯػೳͷ࣮૷͕͢΂ͯ ׬ྃ͠·ͨ͠ʂ ࣮૷ͨ͠಺༰ͷ·ͱΊ 1. جຊػೳ - MultipeerConnectivityΛ࢖༻ͨ͠P2P௨৴ - 4ܻύείʔυʹΑΔηογϣϯ؅ཧ - ࠷େ20ਓ·ͰͷࢀՃऀαϙʔτ - ϦΞϧλΠϜͰͷϦΫΤετૹड৴ 2. UI/UX - λϒόʔߏ੒΁ͷมߋ - ηογϣϯ։࢝ɺϗετɺήετɺϝΠϯը໘ - ઀ଓঢ়ଶόφʔදࣔ - ௨஌ʢα΢ϯυɾόΠϒϨʔγϣϯʣ 3. όοΫάϥ΢ϯυରԠ - ηογϣϯ৘ใͷӬଓԽʢUserDefaultsʣ - όοΫάϥ΢ϯυλεΫͷ؅ཧ - ϑΥΞάϥ΢ϯυ෮ؼ࣌ͷࣗಈ࠶઀ଓʢ࠷େ5ճʣ - ઀ଓঢ়ଶͷࢹ֮తϑΟʔυόοΫ 4. ηΩϡϦςΟɾݖݶ - Info.plistʹϩʔΧϧωοτϫʔΫ࢖༻ڐՄΛ௥Ճ - BonjourαʔϏεͷઃఆ 5. ςετ - 17ݸͷϢχοτςετΛ࡞੒ - ͢΂ͯͷςετ͕੒ޭ Ϗϧυͱςετ΋͢΂ͯ੒ޭ͓ͯ͠Γɺ࣮૷͸׬ྃͰ͢ʂ 24
  11. ͔͔ͬͨ࣌ؒ͸ʁ • 10:03pm: ཁ݅ఆٛClaudeͱ࿩࢝͠Ίͨ • 10:28pm: ཁ݅issueཱ͕ͬͨ • 10:33pm: ઃܭ୲౰Claudeͱ࿩࢝͠Ίͨ

    • 10:51pm: issueʹৄࡉઃܭίϝϯτ͕ॻ͔Εͨ • 10:58pm: ࣮૷୲౰ClaudeʹࢦࣔΛͩ͠ɺࣗ཯తʹಈ͖࢝Ίͨ • 11:34pm: ͢΂ͯͷػೳͷ࣮૷͕׬ྃͨ͠ 28