Lav en app med Claude Code: iPhone-tutorial
Af Mehdi Azizi
Opdateret , 15 min.
Installér Claude Code, opret Expo-projektet, skriv CLAUDE.md, prompt én skærm ad gangen og send appen til TestFlight med EAS. Hele guiden trin for trin.
Lav en app med Claude Code: det korte svar
For at lave en app med Claude Code skal du have betalt adgang til Claude Code (et abonnement, der understøtter det, eller Console med betaling efter forbrug), Node.js, en iPhone med Expo Go og et Expo-projekt. Du skriver en CLAUDE.md-fil, der beskriver din stack og dine regler. Du beder om én skærm ad gangen, tester hver skærm på din iPhone og sender så appen til TestFlight med EAS.
Denne tutorial supplerer min guide lav en iOS-app med AI, som forklarer, hvad AI gør godt, og hvad den misser. Her går vi over til praksis: kommandoerne, filerne, promptene.
Jeg koder mine iOS-apps med Claude Code og Cursor hver dag. Min stack: React Native, Expo, EAS, RevenueCat og Supabase. Solys, et vækkeur med minispil, og TradaZen, en app til at træne trading, er udgivet på App Store. Nolera og Clic blev afvist af Apple og derefter rettet. Alt det følgende kommer fra det arbejde.
Hvis du vil se metoden brugt på en udgivet app, har jeg dokumenteret TradaZens rejse, fra det første commit til Apples afvisninger og pivots. Den erfaring supplerer trinene i denne tutorial.
Trin 1: saml forudsætningerne
Før den første kommando skal du tjekke, at du har alt dette.
En betalt Claude-konto
Claude Code er ikke inkluderet i gratisversionen af claude.ai. Ifølge Anthropics dokumentation skal du have en Pro-, Max-, Team-, Enterprise- eller Console-konto. Pro-abonnementet er nok til at komme i gang, inden for dets forbrugsgrænser.
Node.js og en terminal
Expo kræver Node.js i LTS-version på macOS, Windows eller Linux. Claude Code kører på macOS 13 eller nyere, Windows 10 eller nyere og de store Linux-distributioner.
En iPhone og Expo Go
Installér Expo Go fra App Store på din iPhone, så du kan prøve dine første skærme uden at kompilere din egen app. Før du opretter projektet, så tjek hvilken SDK-version der passer til din installation på Expo Go-siden. Den nyeste SDK og den version, der ligger på App Store, er ikke altid tilgængelige på samme tid: Expo har blandt andet dokumenteret denne forskydning i maj 2026. Tag derfor ikke udgangspunkt i et versionsnummer fra en gammel tutorial. Hvis du vil bruge dine egne native moduler, skal du regne med et development build.
En Mac? Ikke nødvendig
iOS-builds bliver kompileret på Expos servere med EAS Build, med den Xcode-version som din Expo SDK vælger (ITMS-90725), og EAS Submit virker på macOS, Linux og Windows. Du kan altså nå helt til TestFlight fra en pc. Guiden udgiv en iOS-app uden Mac gennemgår hele kæden.
En Apple Developer-konto, senere
Du har ikke brug for den til at kode og teste i Expo Go fra App Store. Den bliver obligatorisk, når du skal sende din app til TestFlight. Det vender vi tilbage til i trin 7.
Trin 2: installér Claude Code
På macOS, Linux eller WSL anbefaler Anthropic den native installer:
curl -fsSL https://claude.ai/install.sh | bash
På Windows, i PowerShell:
irm https://claude.ai/install.ps1 | iex
Tjek derefter, at installationen virkede:
claude --version
Foretrækker du npm, er kommandoen npm install -g @anthropic-ai/claude-code. Brug ikke sudo foran, det fraråder dokumentationen udtrykkeligt.
Første gang du starter claude, åbner en browser, så du kan logge ind på din konto. Derefter skriver du på almindeligt dansk: Claude læser dine filer, foreslår ændringer og kører kommandoer, med din godkendelse.
Trin 3: opret Expo-projektet
Gå til den mappe, hvor du har dine projekter, og kør:
npx create-expo-app@latest my-app
cd my-app
npx expo start
Hvis værktøjet beder dig vælge mellem kompatibilitet med Expo Go fra App Store og den nyeste SDK, så vælg kompatibilitet til denne øvelse. Tjek under alle omstændigheder, at den oprettede version understøttes af den Expo Go, der er installeret på din iPhone, før du fortsætter. Du kan lave et development build, når dit projekt får brug for det.
En QR-kode dukker op i terminalen. Scan den med kameraet på din iPhone: appen åbner i Expo Go. En detalje stopper tit folk første gang: Expo Go åbner kun dit projekt, hvis Expo CLI og Expo Go er logget ind på den samme Expo-konto. Kør npx expo login på din computer, og log ind med den samme konto i appen.
Hvorfor Expo frem for Swift? Claude kender React Native rigtig godt, og du kan teste uden Mac. Jeg forklarer valget på siden React Native og Expo til en mobilapp.
Husk en begrænsning ved Expo Go: den indeholder kun de native moduler, den allerede har indbygget. Så snart du tilføjer et native bibliotek, den ikke kender, for eksempel in-app-køb, skal du bruge et development build. Det er ikke et problem for de første skærme.
Vælg det rigtige testmiljø
Expo Go, et development build og TestFlight beviser ikke det samme. Expo beskriver development build som din egen testapp med de native moduler, dit projekt har brug for.
| Det du vil tjekke | Hvor du tester | Testens begrænsninger |
|---|---|---|
| Vise en første skærm og prøve navigationen | Expo Go, med en kompatibel SDK | Opførslen af native moduler, som Expo Go ikke har |
| Bruge et native bibliotek, du har tilføjet til projektet | Et development build, der indeholder biblioteket | Hverken den udgivne version eller om Apple godkender den |
| Gå appen igennem som tester og derefter teste køb | Et build sendt til TestFlight og korrekt konfigurerede produkter | En rigtig kundebetaling eller godkendelse af salgsudgivelsen |
Før du tilføjer en afhængighed, så spørg Claude: »Er den kompatibel med min SDK og mit nuværende testmiljø? Skal appen kompileres igen? Underbyg dit svar med dokumentationen.« Så slipper du for at bruge en hel aften på at rette et modul, som Expo Go simpelthen ikke kan indlæse, eller en SDK, der bliver afvist ved upload på grund af ikke-offentlig API.
Trin 4: skriv projektets CLAUDE.md-fil
Det er det trin, der betaler sig mest. Claude Code kan have en projekthukommelse, men du skal selv gøre reglerne tydelige. Filen CLAUDE.md, som ligger i roden af projektet, giver fælles instruktioner til alle sessioner. Det er her, du skriver det, Claude ikke kan gætte.
I projektmappen kører du claude og skriver så /init. Ifølge dokumentationen analyserer Claude projektet og genererer en første CLAUDE.md med de kommandoer og konventioner, den finder. Bagefter supplerer du med dine regler. Anthropic anbefaler at holde sig under 200 linjer: jo længere filen er, jo dårligere bliver instruktionerne fulgt.
Her er et kort eksempel, tæt på det jeg selv bruger:
# Min app
## Stack
- Expo (SDK fra create-expo-app), React Native, TypeScript strict
- Navigation: Expo Router, én fil pr. skærm i app/
- Data: Supabase (senere), aldrig en hemmelig nøgle i appen
## Regler
- Én skærm ad gangen. Rør ikke filer uden for opgaven.
- Ingen faste højder i punkter: størrelser relativt til skærmen,
ScrollView hvis indholdet kan blive for langt.
- Hver skærm håndterer 3 tilstande: indlæsning, tom, fejl.
- Interfacetekster på dansk med korrekte æ, ø og å.
- Før du koder mere end 2 filer: foreslå en plan og vent på min godkendelse.
## Kommandoer
- Start: npx expo start
- Tests: brug det script, der faktisk findes i package.json.
Hvis det ikke findes endnu, så sig det; meld ikke beståede tests.
- Typer: npx tsc --noEmit
- Efter hver ændring: kør tests og typer, og fortæl mig så,
hvad der er ændret, og hvordan jeg tjekker det på iPhone.
Reglen om faste højder er der ikke tilfældigt. Det vender vi tilbage til i trin 6.
Trin 5: prompt én skærm ad gangen
»Lav en vane-tracker-app med abonnement til mig« giver et kæmpe projekt, der er skrøbeligt og umuligt at læse igennem. Metoden, der virker, er det modsatte: én forespørgsel, én skærm, ét resultat du kan teste på fem minutter.
Start med en plan
Til alt, der rører flere filer, skal du skifte til plan mode. Tryk på Shift+Tab, indtil du ser plan mode on i statuslinjen. I denne tilstand læser Claude filerne og foreslår en plan, men ændrer intet, før du har godkendt. Du læser, retter til og godkender.
En første prompt til at sætte rammerne ser sådan ud:
Jeg vil have en vane-tracker-app. Version 1: kun én funktion,
at krydse dagens vaner af. Foreslå listen over skærme og
mappestrukturen. Kod ikke noget endnu.
Beskriv skærmen, dens tilstande og dens grænser
Derefter én prompt pr. skærm. Jo flere grænsetilfælde du nævner, jo færre glemmer Claude:
Opret skærmen app/index.tsx, der viser dagens vaner.
- Hver linje: vanens navn, et afkrydsningsfelt, den nuværende streak.
- Tom tilstand: en tekst og en knap »Tilføj en vane«.
- Indlæsningstilstand og fejltilstand med en knap »Prøv igen«.
- Data kommer fra et lokalt array indtil videre.
- Skal passe på en iPhone SE såvel som på den største iPhone:
ingen fast højde, listen skal kunne scrolle.
Kør tests og typer til sidst.
Ret uden at lade alt blive skrevet om
Når en detalje ikke er i orden, så vær præcis og begræns omfanget:
På min iPhone glider knappen »Tilføj en vane« ind under bundbjælken,
når listen er lang. Ret kun det problem i app/index.tsx, uden at
røre de andre filer. Forklar årsagen.
Du kan også indsætte et skærmbillede i terminalen: Claude kan læse det.
Øvelse: en vane, der forbliver afkrydset efter genstart
Her er en pædagogisk øvelse, du laver i dit eget projekt, ikke et skærmbillede af en funktion, der allerede er leveret. Målet er at gå fra en genereret skærm til en opførsel, du kan verificere. Den kræver hverken brugerkonto eller in-app-køb.
- Behold én enkelt lokal vane med navnet »Læs 10 minutter«.
- Bed om et afkrydsningsfelt og en lokal lagring, der er kompatibel med dit Expo-projekt.
- Bed agenten om at angive de ændrede filer, en eventuel afhængighed og de kommandoer, den faktisk har kørt.
- Installér eller åbn din app på iPhonen, og lav så tjekkene herunder.
Med udgangspunkt i den eksisterende skærm skal vanen »Læs 10 minutter«
kunne krydses af, og dens tilstand skal bevares, når appen lukkes og åbnes igen.
Brug den lokale lagring, der er kompatibel med projektets afhængigheder.
Opret ikke konto, server, abonnement eller ekstra statistik.
Før du koder, så forklar hvordan du håndterer indlæsning og en fejl
ved læsning eller gemning. Lav derefter en afgrænset ændring.
Til sidst: ændrede filer, kørte kommandoer, utestede begrænsninger
og præcise trin til at tjekke resultatet på iPhone.
| Handling på din iPhone | Forventet resultat | Hvis det fejler |
|---|---|---|
| Åbn appen for første gang | Vanen og dens felt er synlige, uden fejl | Tjek starttilstanden og indlæsningen fra lagringen |
| Kryds af, luk og åbn appen igen | Vanen forbliver afkrydset | Kontrollér skrivning og derefter læsning af den samme nøgle |
| Fjern krydset og genstart | Vanen forbliver uden kryds | Tjek at værdien false også bliver gemt |
| Gentag forløbet i flytilstand | Den lokale funktion er stadig tilgængelig | Find en netværksafhængighed, der er tilføjet uden grund |
| Gør tekststørrelsen større | Navnet og kontrollen forbliver tilgængelige | Fjern de begrænsninger, der afkorter eller skjuler handlingen |
Bed ikke om »skriv det hele om«, hvis én linje fejler. Beskriv handlingen, det forventede resultat og det, du faktisk ser. For eksempel: »Efter genstart er feltet tomt igen, selvom jeg havde krydset det af. Forklar årsagen, og ret lagringen uden at ændre designet.«
Download CLAUDE.md-skabelonen og tjeklisten (.md). Åbn den i din editor eller i en note-app. Tilpas kommandoerne til dit projekt, før du giver den til agenten.
Trin 6: få det gennemgået og testet
Claude Code skriver kode, der ser rigtig ud. Kun dine tests og din iPhone fortæller dig, om den er det.
Tests, så du ikke ødelægger det, der virker
Jo større din app bliver, jo større er risikoen for, at hver forespørgsel ødelægger en skærm, du allerede har godkendt. Projektet, som Expo opretter, har ingen tests: bed først Claude om at installere Jest med jest-expo, som Expos dokumentation anbefaler. Bed derefter om tests til den vigtige logik (beregning af en streak, validering af en formular), og få dem kørt efter hver ændring. Det er derfor, testkommandoerne står i CLAUDE.md: Claude kører dem, uden at du skal minde den om det. Med en regelfil og tests ødelægger AI'en langt sjældnere det, der allerede virkede.
Gennemgå hver ændring
Du behøver ikke forstå hver linje. Du skal vide, hvilke filer der er ændret, og hvorfor. Hvis Claude har rørt en fil, der ikke har noget med opgaven at gøre, så spørg hvorfor, før du accepterer. Stil så spørgsmålet: »hvad kan gå i stykker her?«.
Tjek på en lille og en stor iPhone
Det er den lektie, der har kostet mig mest. Solys blev afvist af Apple under regel 2.1: onboarding-demoen var umulig at vinde på en iPad Air, hvor appen kørte i iPhone-kompatibilitetstilstand. Årsagen: højder kodet i faste punkter, ikke relativt til skærmstørrelsen. På min iPhone var alt fint. Koden var gennemgået, testene var grønne. Intet værktøj havde kigget på skærmen i en anden størrelse.
Siden da tjekker jeg hver skærm som minimum på den mindste og den største iPhone. Har du kun én telefon, kan Xcodes simulator på en Mac eller en ven med en anden model klare det. Kig især på lange tekster, åbent tastatur på formularer og knapper, der sidder fast i bunden.
Det, Claude Code gør dårligt
Claude Code er fremragende til skærme og logik. Uden for din mappe er den langt mindre pålidelig.
Signering og certifikater
Uden en godkendt forbindelse til din Apple-konto kender Claude ikke dens tilstand. Den kan finde på en certifikatprocedure, der blander Xcode og Expo sammen. Lad EAS håndtere signeringen: Expos dokumentation forklarer, at EAS CLI kan generere og gemme de filer for dig, når du har logget ind på din Apple Developer-konto.
App Store Connect
Produktsiden, privatlivsoplysningerne, skærmbillederne og de juridiske links er data, du skal tjekke i App Store Connect. Claude Code kan nu handle i en browser, der er logget ind, via sin Chrome-integration, med de nødvendige adgange. Det garanterer ikke, at felterne er korrekte: læs oplysningerne igennem, tjek hvilke konti der bruges, og godkend selv erklæringerne og indsendelsen til review.
Abonnementer
At skrive en paywall tager ti minutter. At få produkterne i App Store Connect, deres konfiguration i RevenueCat og koden til at passe sammen er en helt anden historie. Et id, der afviger med ét tegn, og paywallen er tom hos revieweren. De mest almindelige faldgruber står i begyndernes fejl med iOS-paywalls.
Grænsetilfælde
Uden instruktioner håndterer Claude kun normaltilfældet. Intet netværk, en tom liste, et afbrudt køb: dem skal du selv nævne.
Sikkerhed i Supabase
Når Claude opretter tabeller i Supabase, så tjek at sikkerhed på rækkeniveau (RLS) er slået til, med politikker der begrænser hver bruger til sine egne data. Tjek også, at ingen hemmelig nøgle ender i appens kode. Skriv de to forbud ind i din CLAUDE.md, så snart du kobler en database på.
Trin 7: gå over til TestFlight med EAS
Dine skærme er tjekket i Expo Go eller i et development build, afhængigt af hvilke moduler du bruger. Gå nu videre til det build, der skal ud til testerne.
Forbered EAS
Nu skal du have en betalt Apple Developer-konto: som Expo minder om, er den obligatorisk for at sende en app til App Store. Installér derefter Expos værktøj, og konfigurér projektet:
npm install --global eas-cli
eas login
eas build:configure
Tilføj et unikt bundle-id i app.json under ios.bundleIdentifier, for eksempel com.yourname.myapp.
Kompilér og send
eas build --platform ios --profile production
eas submit --platform ios
Den første kommando kompilerer appen på Expos servere. Første gang tilbyder EAS at logge ind på din Apple-konto for at oprette certifikaterne. Den anden sender buildet til App Store Connect. Du kan også gøre det hele på én gang med eas build --platform ios --auto-submit.
Buildet skal behandles af Apple, før det dukker op i TestFlight, og den behandling kan afvise det, for eksempel med ITMS-90717 for et gennemsigtigt ikon. En vellykket upload betyder altså ikke, at det allerede kan installeres: tjek dets status i App Store Connect. Interne og eksterne testere samt beta-review er forklaret i min guide TestFlight til at teste din iPhone-app.
Gentag tjekkene fra trin 6 på dette build. En app, der virker i Expo Go, kan stadig crashe i produktion, for eksempel når et native modul mangler.
Hvad det reelt koster
Her er de priser, tjenesterne viser, tjekket den 27. september 2026, i dollars. Det beløb, du bliver opkrævet, afhænger også af din region, skatter og dit forbrug: tjek abonnementet, før du tegner det.
- Claude-abonnement: Pro koster 20 $ om måneden, eller 17 $ om måneden ved årlig betaling. Max-abonnementerne starter ved 100 $ om måneden, til mere forbrug.
- Apple Developer-konto: 99 $ om året, obligatorisk for TestFlight og App Store.
- EAS: Expos gratis abonnement inkluderer 15 iOS-builds om måneden i en kø med lav prioritet. Starter-abonnementet koster 19 $ om måneden plus ekstra forbrug.
Til en lille prototype kan Pro og EAS' gratis abonnement være et udgangspunkt, hvis du holder dig inden for deres kvoter. Læg Apple-kontoen oveni før TestFlight, og regn derefter separat på de tjenester, du faktisk har brug for: database, lagring eller betalt API. Budgetskabelonen til en første app hjælper dig med at stille posterne op. Din tid til opsætning og tjek skal også regnes med.
De ærlige begrænsninger, og hvor man går i stå
Claude Code har ændret, hvem der kan lave en iPhone-app. Den har ikke ændret, hvad Apple kræver for at udgive den. En afvisning kommer hurtigt: Solys har fået nogle, Nolera og Clic også. De hyppigste årsager er beskrevet i hvorfor Apple afviser en app.
Du kan nå helt til TestFlight på egen hånd med denne tutorial. Der, hvor folk oftest går i stå, er bagefter: at koble abonnementer på, forberede materialet til revieweren, forstå en afvisning. For overblikket over hele forløbet kan du læse siden lav en iPhone-app.
Til den del samler iOS Kit startkoden fra mine apps, inklusive abonnementer, Claude Code-skills til hvert trin og Apple Review Kit. Hele forløbet finder du på siden Claude Code-kursus til at lave en iOS-app.
Sidder du allerede fast uden at vide hvorfor? Den gratis diagnose fortæller dig, hvad der reelt holder dig tilbage, og sender dig min tjekliste mod Apple-afvisninger.
Ofte stillede spørgsmål
Kan man lave en iPhone-app med Claude Code uden at kunne kode?
Ja til skærme og simpel logik, hvis du gennemgår og tester hvert trin. Nej, hvis du håber på slet ikke at skulle forstå noget. Du skal kunne læse en fejlmeddelelse, køre en kommando og tjekke, hvad Claude har ændret. Det lærer du hurtigt, mens du bygger.
Er Claude Code gratis?
Nej. Claude Code kræver en Pro-, Max-, Team-, Enterprise- eller Console-konto. Gratisversionen af claude.ai inkluderer den ikke. Pro-abonnementet er nok til at starte, med forbrugsgrænser du skal holde øje med.
Skal man have en Mac for at lave en iOS-app med Claude Code?
Nej. Du koder på en hvilken som helst computer, tester i Expo Go på din iPhone, og EAS kompilerer og sender appen fra Expos servere. En Mac er stadig praktisk til simulatoren, men den er ikke nødvendig.
Claude Code eller Cursor til en React Native-app?
Jeg bruger begge hver dag. Claude Code arbejder i terminalen og klarer selv ændring og tests i ét flow. Cursor er en editor. Metoden betyder mere end værktøjet: regler, én skærm ad gangen, tests.
Hvor lang tid tager det at udgive en første app med Claude Code?
Det afhænger af appens størrelse og din tid. En app med én funktion går meget hurtigere. Den mest uforudsigelige del er stadig Apples review.
Kan Claude Code sætte in-app-abonnementer op?
Den kan skrive koden til paywallen og RevenueCat. Med tilsluttede værktøjer og de nødvendige tilladelser kan den også arbejde i konsollerne. Gå aldrig ud fra, at produkterne er konfigureret, bare fordi koden findes: tjek id'er, priser og rettigheder efter køb, og test så køb og gendannelse på TestFlight. De almindelige fejl med iOS-paywalls giver dig de punkter, du skal kontrollere.