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

人にも AI にも触らせやすい iOS アプリ設計 — SessionShell 型 Clea...

人にも AI にも触らせやすい iOS アプリ設計 — SessionShell 型 Clean Architecture

コーディングエージェント(Claude Code)でスピード開発する時代に、「速さ」を活かしつつハルシネーションを"設計"で抑えるための iOS アプリ設計を解説します。
状態判定を RootView に集約する State-Driven 設計と、認証 × 課金 × ルーティングのような横断状態を"第四の場所"に切り出す SessionShell パターンを、Firebase Auth × RevenueCat の実例(.guestPremium 事件と真理表による対策)を交えて紹介。型・純粋関数・単一の観測点によって、LLM の編集を構造的に安全にする考え方をまとめています。
勉強会 / Tech Talk 発表資料。iOS エンジニア、AI を活用した開発に関心のある方向け。
#iOS #SwiftUI #CleanArchitecture #ClaudeCode #生成AI

Avatar for いかり

いかり

June 27, 2026

Other Decks in Programming

Transcript

  1. Session Shell RootView (State Authority) UseCase Domain / Entity ษڧձ

    / Tech Talk Claude Code εϐʔυ։ൃ SessionShellܕ Clean Architecture ਓʹ΋ AI ʹ΋৮Βͤ΍͍͢ iOS ΞϓϦઃܭ
  2. AGENDA ຊ೔͓࿩͢͠Δ͜ͱ 01 എܠ 02 ΞϓϦઃܭʹ͓͚Δॏཁͳ؍఺ 03 εϐʔυ։ൃʹ͓͚Δ҆શͳઃܭ 04 State-Driven

    ઃܭʢঢ়ଶͷ࣋ͪํ / RootView ௖఺ʣ 05 SessionShell ͱ͸ʢPlus ͷ࣮ྫͰղ๤ʣ 06 ΞʔΩςΫνϟશମ૾ 07 ͳͥ͜ͷઃܭ͕ AI։ൃʹ޲͍͍ͯΔͷ͔ 02
  3. BACKGROUND 01 എܠ ίʔσΟϯάΤʔδΣϯτ࣌୅ͷʮ଎͞ʯͱʮة͏͞ʯ 1 ίʔσΟϯάΤʔδΣϯτʹΑΔ։ൃεϐʔυͷ޲্ ੜ੒ˠ࣮ߦˠमਖ਼ͷϧʔϓ͕୹ॖ͞Εɺ࣮૷଎౓͕େ෯ʹ޲্ ޮ༻ 2 ίʔσΟϯάΤʔδΣϯτʹ͓͚Δϋϧγωʔγϣϯ

    ΋ͬͱ΋Β͍͠ޡΓɻଘࡏ͠ͳ͍APIɾޡͬͨલఏͷ··࣮૷͕ਐΉϦεΫ ՝୊ 3 ઃܭʹΑΔεϖοΫυϦϒϯʗςετυϦϒϯͷཱ྆ ڥքΛݻఆ͢Ε͹ʮ࢓༷४ڌʯͱʮςετ༰қੑʯΛಉ࣌ʹ୲อͰ͖Δ ղܾͷํ޲ ଎͞Λ׆͔ͭͭ͠ɺϋϧγωʔγϣϯΛ“ઃܭ”Ͱ཈͑Δ ── ͕ຊ೔ͷग़ൃ఺ 03
  4. PRINCIPLES 02 ΞϓϦઃܭʹ͓͚Δॏཁͳ؍఺ “มΘΓ΍͍͢΋ͷ” Λ Ͳ͜Ͱٵऩ͢Δ͔ 1 ಺෦ઃఆͳͲͷ؀ڥઃఆ ؀ڥ͝ͱʹมΘΔ஋ʢAPIΩʔɾϑϥάɾ઀ଓઌʣΛίʔυ͔Β෼཭ɾू໿ Config

    2 State-Action-Event ΛͲ͜ͰͲͷΑ͏ʹ࣋ͭͷ͔ ঢ়ଶɾૢ࡞ɾΠϕϯτͷ੹຿ΛʮͲͷ૚ʹɾͲ͏࣋ͨͤΔ͔ʯ── ઃܭͷ֩ State 3 ֎෦σʔλͷऔಘϙΠϯτ ֎෦I/OʢAPIɾDBʣͷೖޱΛݶఆ͠ɺ಺ଆΛ֎෦࢓༷ͷมԽ͔ΒकΔ I/O ͱΓΘ͚ State ͷ࣋ͪํ ͕ཁ ── ࣍ͷ State-Driven ઃܭ΁ 04
  5. SAFE & FAST 03 εϐʔυ։ൃʹ͓͚Δ҆શͳઃܭ ӨڹൣғΛ ԣɾॎɾ࠷֎૚ Ͱด͡ࠐΊΔ 1 ੹຿ͷִ཭

    ֤ ManagerObject ʹ໾ׂΛด͡ࠐΊɺӨڹൣғΛݶఆ͢Δ ԣͷ෼ׂ 2 ֊૚ߏ଄ͷઃఆ StateʗσʔλΛπϦʔԽ͠ɺॴ༗ɾࢀরؔ܎Λ໌֬ʹ͢Δ ॎͷߏ଄ 3 ֎෦IOͷִ཭ ֎෦I/O Λ Clean Architecture ͷ࠷֎૚΁ɻ಺ଆͷυϝΠϯ͔Β੾Γ཭͢ ࠷֎૚ ඃ֐͕ہॴԽ͢Δ͔Β “଎͘յͯ͠଎͘௚ͤΔ” ── ࠷֎૚ͷൃ૝͸ޙͷ SessionShell ΁ 05
  6. STATE-DRIVEN ᶃ 04 State-Driven ઃܭ ᶃʛঢ়ଶͷ࣋ͪํ ૪఺͸ʮͲ͜Ͱ࣋ͭ / Ͳ͏؅ཧ͢Δ /

    ͍ͭಉظ͢Δʯ 1 State ʹॏཁ౓ϥϯΫΛ෇͚Δ ͢΂ͯΛಉ͡ॏ͞ͰѻΘͳ͍ɻॏཁ౓ʹԠͯ͡؅ཧίετΛ഑෼͢Δ RANK 2 ߴ༏ઌ౓ͷ State ͸ StateManager + StateMachine ભҠΛ໌ࣔͯ͠ϒϥοΫϘοΫεԽΛഉআ → AIͷϋϧγωʔγϣϯΛ๷͙ MANAGE 3 Root ʹू໿͢Δ ඇಉظͳ֤ State ͷ࠷৽Λू໿͢ΔήʔτʢϢʔβʔঢ়ଶɾαʔϏεঢ়ଶΛಉظతʹѻ͏ʣ ROOT ॏཁ౓ϥϯΫ → ໌ࣔతͳঢ়ଶ؅ཧ → Rootू໿ ͕ State-Driven ͷ౔୆ 06
  7. STATE-DRIVEN ᶄ 04 State-Driven ઃܭ ᶄʛRootView ௖఺ ঢ়ଶ൑ఆΛ௖఺(RootView)ʹू໿͠ɺ༿͸ඳըʹప͢Δ RootView switchʢঢ়ଶ൑ఆʣ

    ༿ View A mode Λඳը ༿ View B mode Λඳը ༿ View C mode Λඳը ༿͸ϧʔςΟϯάΛ஌Βͳ͍ switch ҰຕͰશମ૾ ʮେঢ়ଶ × Ϣʔβʔঢ়ଶ → දࣔʯΛશྻڍͰ͖Δ ہॴฤू͕҆શ ༿͸൑ఆΛ࣋ͨͣ mode ΛඳըɻฤूͷӨڹ͕ 1:1 ʹด͡Δ ७ਮؔ਺ʹΑΔ೿ੜ spec 㲗 test 㲗 ࣮૷ ͕ߏ଄తʹಉܕʹอͨΕΔ 07
  8. SESSION SHELL ᶃ 05 SessionShell ͱ͸ ᶃʛShellԽͷ5৚݅ Shell ͱͯ͠֎ʹ੾Γग़͢΂͖৘ใͷ൑ఆج४ 1

    ෳ਺ͷಠཱͳ֎෦ೖྗ͔Β೿ੜ͢Δ ୯ҰೖྗͳΒ ViewModel ͰࡁΉɻෳ਺ͩͱଋͶΔ৔ॴ͕ཁΔ 2 ૊Έ߹Θ͕ͤ combinatorial ʹരൃ͢Δ View ͝ͱͷ if ෼ذ͸ N×M×L ʹ૿͑ɺඞͣऔΓ͜΅͢ 3 UI ͱ αʔό(API) ͷ྆໘ʹಉ࣌ʹޮ͘ ยํ͚ͩߋ৽͢Δࣄނ͕ى͖ɺ੔߹ੑ่͕ΕΔ 4 มߋ࣌ʹॱং͋Δ෭࡞༻͕ඞཁ ʮઌʹ claim ΛऔΔʯ౳ͷ࣌ܥྻ੍໿͸ҰՕॴʹด͡Δ 5 RootView ͕௚઀࣋ͭʹ͸ॏ͗͢Δ ʮRootViewΛಡΊ͹શମ͕෼͔Δʯੑ࣭Λյ͞ͳ͍ Domain Ͱ΋ View Ͱ΋ Repository Ͱ΋ͳ͍ “ୈ࢛ͷ৔ॴ” = SessionShellɹʗɹ3ͭҎ্֘౰ˠShellԽ, 1ʙ2ݸˠViewModel, 0ݸˠView 08
  9. SESSION SHELL ᶄ 05 SessionShell ͱ͸ ᶄʛPlus ͷ࣮ྫ ೝূ ×

    ՝ۚ × ϧʔςΟϯά ͸ 5৚݅͢΂ͯΛຬͨ͢ʢయܕྫʣ ಠཱͨ͠3ೖྗ Firebase Auth ະೝূ / ಗ໊ / ೝূࡁ RevenueCat Premium entitlement ID Token claim αʔόଆͷݖݶϑϥά SessionShell ਖ਼نԽ UserStatus .from(auth, isPremium) = ७ਮؔ਺ UserStatusʢ5έʔεʣ .notAuthenticated .guest .guestPremium .authenticatedFree .authenticatedPremium 5έʔεͰ໢ཏՄ ʗ ೖྗ͔Βͷ७ਮؔ਺ͰಉظζϨ͕ߏ଄తʹى͖ͳ͍ ʗ isPremium ͷ௚઀ࢀর͸ېࢭʢSSOT͸ PurchaseManager.isPremiumʣ 09
  10. SESSION SHELL ᶅ 05 SessionShell ͱ͸ ᶅʛࣄ݅ͱରࡦ .guestPremium ௥ՃͰ UI

    ͱ API ͷ੔߹่͕Εͨࣄ͔݅ΒֶͿ ⾠ ࣄ݅ɿ.guestPremium ͷ௥Ճ ▸ UI ͸ Premiumɺ͕ͩ Premium API ͚ͩམͪΔ ▸ ಗ໊UIDʹ͸ claim Λ෇༩Ͱ͖ͳ͔ͬͨ ▸ ہॴमਖ਼͸ঢ়ଶͷ૊Έ߹ΘͤΛඞͣऔΓ͜΅͢ ✓ ରࡦɿਅཧද × /session-guard ▸ શೖྗͷ૊Έ߹ΘͤΛਅཧද(truth table)Ͱ࢓༷Խ ▸ ਅཧදΛςετͷ oracle ͱͯ͠ݻఆ ▸ /session-guard ͕ฤूલޙͷήʔτΛࣗಈ࣮ߦ ݪଇɿspec → test → ࣮૷ ͷॱংΛݫकʢٯॱ͸“࣮૷ͷ௥ೝ”Ͱ๷ޚʹͳΒͳ͍ʣ ShellԽͷ伱ؒʢ৚݅3ʮUI×APIʯɾ৚݅4ʮॱং͋Δ෭࡞༻ʯʣʹམͪͨࣄނͩͬͨ 10
  11. ARCHITECTURE 06 ΞʔΩςΫνϟશମ૾ ֎෦SaaS → SessionShell → RootView → Feature

    ͷҰํ޲ϑϩʔ ֎෦ SaaS Firebase Auth RevenueCat ID Token claim SessionShell AuthState / UserStatus ʹਖ਼نԽ ʢ७ਮؔ਺ʣ RootView rootState × userStatus Ͱ ϧʔςΟϯάू໿ Feature View ContentMode Λ ड͚औΓඳը ʢ൑ఆΛ࣋ͨͳ͍ʣ Լྲྀ(API/claim)΁͸෭࡞༻Λɺ্ྲྀ(View)΁͸ UserStatus Λ౉͢ ── Clean Core ͸ Premium ϩδοΫʹԚછ͞Εͳ͍ ґଘ͸Ұํ޲ɻঢ়ଶ൑ఆ͸ RootView ʹด͡ɺࢠ View ʹ͸࿙Β͞ͳ͍ 11
  12. WHY FOR AI 07 ͳͥ͜ͷઃܭ͕ AI։ൃʹ޲͍͍ͯΔͷ͔ State-Driven on RootView ×

    SessionShell ͕ LLM ʹޮ͘ཧ༝ 5.1 શମ૾͕ҰຕͰಡΊΔ RootView ͷ switch ΛಡΊ͹ը໘ભҠ͕શྻڍɻίϯςΩετফඅ͕ۃখ 5.2 ہॴฤू͕ߏ଄తʹ҆શ ༿͸ϧʔςΟϯάΛ஌Βͳ͍ → ෭࡞༻ͷ࿙Ε͕ى͖ͳ͍ʢ1:1ରԠʣ 5.3 ܕγεςϜ͕๷ޢนʹͳΔ enum ͷ໢ཏੑνΣοΫͰɺέʔε௥Ճ๨ΕΛίϯύΠϥ͕ڋ൱ 5.4 spec / test / ࣮૷͕Ұ௚ઢ ७ਮؔ਺ + ਅཧදͰࡾऀ͕ಉܕ → Ͳ͔͜Βੜ੒ͯ͠΋ໃ६͠ͳ͍ 5.6 Skill / Workflow ͱ઀ଓͰ͖Δ ฤूڥք͕໌͔֬ͩΒ /session-guard ͷτϦΨΛॻ͚Δ 12
  13. SUMMARY 00 ·ͱΊ ·ͱΊ ▸ State-Drivenɿॏཁ౓ϥϯΫ → ໌ࣔత؅ཧ → Rootू໿

    → RootView௖఺Ͱ൑ఆΛू໿ ▸ SessionShellɿ5৚݅Λຬͨ͢ԣஅঢ়ଶΛ“ୈ࢛ͷ৔ॴ”΁੾Γग़͠ɺenumҰͭʹਖ਼نԽ ▸ ࣄ݅ .guestPremium → ਅཧදͰ࢓༷Խ͠ test ͷ oracle ʹݻఆʢspec→test→࣮૷ʣ ▸ ܕɾ७ਮؔ਺ɾ୯Ұͷ؍ଌ఺͕ɺLLM ͷฤूΛߏ଄తʹ҆શʹ͢Δ ଎͘ॻ͘ͷ͸ AIɻյΕͳ͍Α͏ʹकΔͷ͸ઃܭɻ State-Driven × SessionShell ʹ ਓʹ΋ AI ʹ΋৮Βͤ΍͍͢ iOS ΞϓϦ 13