Przejdź do głównej zawartości

Tworzenie aplikacji mobilnych w Cursorze

Tworzenie aplikacji mobilnych w Cursorze działa wtedy, gdy agent może sam sprawdzić swój wynik na urządzeniu. Reguła projektu ograniczona globami przypina wersje React Native i polecenia definiujące „gotowe”. Serwery MCP pozwalają agentowi zbudować, uruchomić aplikację i robić jej zrzuty ekranu na symulatorze iOS i emulatorze Androida. Każda zmiana trafia do przeglądu z wynikiem bramek i zrzutem ekranu z każdej platformy.

Ta strona jest dla programistów i tech leadów, którzy budują aplikacje React Native lub Expo w Cursorze. Znana sytuacja: Agent zrobił ekran profilu, który wygląda dobrze na otwartym akurat symulatorze iPhone’a, w opisie pull requesta stoi „gotowe”, a dwa dni później QA zgłasza, że na Androidzie klawiatura zasłania przycisk zapisu. Nikt nie przeczytał uważnie 600-liniowego diffu i nikt nie powinien być do tego zmuszony. Rozwiązaniem jest pętla, w której agent uruchamia aplikację na obu platformach i oddaje ci dowody.

  • Regułę projektu .cursor/rules/react-native.mdc, która powstrzymuje Agenta przed pisaniem kodu webowego i API ze starszego React Native.
  • Dwa serwery MCP w .cursor/mcp.json, które dają Agentowi symulator i emulator do testów.
  • Cztery prompty do skopiowania: przygotowanie reguły, ekran z projektu, poprawka błędu z jednej platformy i diagnoza nieudanego buildu natywnego.
  • Tabelę bramek, która mówi, co dowodzi poprawności zmiany mobilnej i kto ją zatwierdza, więc przeglądasz zrzuty i wyniki testów zamiast każdej linii.
  • Typowe awarie pracy mobilnej w Cursorze, każdą z krokiem naprawczym.

Receptury frameworkowe (dane offline-first, FlashList, biometria, buildy EAS, aktualizacje OTA) są w książce kucharskiej o aplikacjach mobilnych. Tutaj skupiamy się na tym, co należy do Cursora: kontekście, pętli agenta i dowodzie.

Agenci mieszają API z kilku wersji głównych, bo dane treningowe obejmują je wszystkie, więc wersje należą do reguły, a nie do twojej pamięci. Tabela pokazuje, co npm serwował 26 września 2026; podmień liczby na te z twojego lockfile’a.

PakietWersja w npm, 2026-09-26Po co agentowi ta wiedza
react-native0.87.1 (Expo SDK 57 przypina 0.86.3)Od 0.82 New Architecture jest jedyną architekturą; stare poradniki o modułach mostkowych nie mają już zastosowania
expo57.0.26Pakiety natywne dodawaj przez npx expo install, nigdy przez ręczną edycję wersji
@react-navigation/native7.5.0Typowane parametry tras pochodzą z twojego RootStackParamList
nativewind4.2.7Style przez className, nie StyleSheet.create, jeśli projekt go używa
@tanstack/react-query5.104.0Stan serwera i opcje networkMode dla zachowania offline
mobilebuildmcp2.7.1Buildy iOS, symulatory i testy dla agenta (dawniej xcodebuildmcp)
@mobilenext/mobile-mcp1.0.6Dotknięcia (tap), wpisywanie tekstu, zrzuty ekranu i logi na urządzeniach iOS i Android

Sam Cursor to linia 3.x, stan na 26 września 2026.

Wykonaj te cztery kroki raz na repozytorium i zacommituj wynik, żeby Agent każdego członka zespołu startował z tym samym kontekstem. Jeśli nigdy nie pisałeś reguły Cursora, przeczytaj najpierw reguły projektu w Cursorze.

  1. Napisz regułę mobilną ograniczoną do kodu aplikacji. Zapisz ją jako .cursor/rules/react-native.mdc (w formacie, którego używa strona o regułach projektu). Linia globs ładuje regułę, gdy Agent dotyka kodu aplikacji, i nic nie kosztuje, gdy Agent pracuje nad backendem.

    ---
    description: React Native app conventions and the done criteria for mobile changes
    globs: src/**/*.ts,src/**/*.tsx,app/**/*.tsx
    alwaysApply: false
    ---
    This is React Native 0.86 (New Architecture only) on Expo SDK 57, not React DOM.
    - Never use HTML elements (div, span, img, button), CSS strings or web-only style properties.
    - Add native packages with `npx expo install <pkg>`. Never change a version in package.json by hand.
    - Screens live in src/screens/, one per file. Register each in @src/navigation/RootNavigator.tsx
    and add its params to RootStackParamList in @src/navigation/types.ts.
    - Style with NativeWind className. Shadows: use the boxShadow style prop (RN 0.76+, New Architecture)
    or NativeWind shadow-* classes; never CSS strings or web-only properties.
    - Platform files (.ios.tsx / .android.tsx) take priority over the base file in Metro.
    Before editing a component, check whether a platform variant exists and edit that one too.
    Done means all of these pass, and you paste the output:
    1. npx tsc --noEmit
    2. npx expo lint
    3. npx jest --ci
    4. npx expo install --check (native packages at the versions the SDK expects)
    5. rg -n "<(div|span|img|button|p)[ >]" src app (must print nothing; list only folders that exist)
    6. For UI changes: a screenshot of every changed screen on the iOS simulator and the
    Android emulator, saved to evidence/<task>/ios-*.png and evidence/<task>/android-*.png

    W czystym React Native bez Expo zamień npx expo install na swój menedżer pakietów, a npx expo lint na swoje polecenie ESLint.

  2. Odetnij agenta od zacommitowanych plików, których nie powinien czytać. Kod agenta Cursora wczytuje .gitignore tak samo jak .cursorignore (sprawdzone w @cursor/sdk 1.0.32, 2026-09-26), więc ignorowane przez gita node_modules/, ios/Pods/ i katalogi buildów nie potrzebują drugiego wpisu. .cursorignore służy do plików, które są w repozytorium, ale Agent nie powinien ich czytać ani naśladować. Uruchom git ls-files ios/Pods android/app/build | head, żeby sprawdzić, czy zespół coś z tego commituje, i wpisz tylko to, co się pojawi:

    Okno terminala
    # .cursorignore: committed files the agent must not read or imitate
    # (example entries; keep only paths that git ls-files shows in your repo)
    ios/Pods/
    android/app/src/main/assets/index.android.bundle
    **/__snapshots__/
    src/legacy-web/

    Nigdy nie ignoruj ios/Podfile, android/app/build.gradle ani app.json: Agent potrzebuje ich do naprawy błędów buildu natywnego. Składnię i błąd, który Agent zgłasza przy zablokowanej ścieżce, opisuje zarządzanie kontekstem w Cursorze.

  3. Daj Agentowi urządzenie. Dodaj oba serwery do .cursor/mcp.json w katalogu głównym repozytorium. MobileBuildMCP (utrzymywany przez Sentry) buduje i testuje aplikacje iOS; wymaga macOS 14.5 lub nowszego i Xcode 16 lub nowszego. mobile-mcp (Mobile Next) steruje symulatorami iOS, emulatorami Androida i fizycznymi urządzeniami przez zrzuty ekranu i migawki dostępności; dla Androida potrzebuje narzędzi platformy (adb) w PATH.

    {
    "mcpServers": {
    "MobileBuildMCP": {
    "command": "npx",
    "args": ["-y", "mobilebuildmcp@latest", "mcp"]
    },
    "mobile-mcp": {
    "command": "npx",
    "args": ["-y", "@mobilenext/mobile-mcp@latest"]
    }
    }
    }

    Oba wpisy odpowiadają fragmentom konfiguracji dla Cursora od samych dostawców (strona MCP Clients w dokumentacji MobileBuildMCP i README mobile-mcp, sprawdzone 26 września 2026). MobileBuildMCP zgłasza własne błędy wykonania do Sentry; jego README linkuje instrukcję wyłączenia. Na Linuksie lub Windowsie pomiń MobileBuildMCP i zostaw mobile-mcp dla Androida. Każdy podłączony serwer to więcej narzędzi i opisów, spośród których Agent wybiera, więc włączaj je tylko w repozytorium aplikacji. Jak włączać, wyłączać i sprawdzać serwery, pokazuje konfiguracja serwerów MCP w Cursorze.

  4. Sprawdź konfigurację przed pierwszym prawdziwym zadaniem. Otwórz nowy czat Agenta i poproś: „Use mobile-mcp to list the available devices, then use MobileBuildMCP to build the app for the first iPhone simulator. Report the tool calls you made.” Poprawna odpowiedź podaje prawdziwe ID urządzenia i pokazuje wywołanie narzędzia. Odpowiedź bez wywołania narzędzia oznacza, że serwer nie jest podłączony, a Agent zgadywał.

Opcjonalnie: skille frameworkowe dodają wiedzę specyficzną dla wersji i ładują się tylko wtedy, gdy zadanie jej potrzebuje. Zestaw React Native od Callstacka (społecznościowy, nie Meta) instalujesz dla Cursora narzędziem CLI skills, które obsługuje wielu agentów (1.7.0 w npm, 2026-09-26; zobacz instalowanie skilli i zarządzanie nimi): npx skills@latest add callstackincubator/agent-skills --skill react-native-best-practices --agent cursor -y. Zestawy dla Expo i Fluttera wymienia książka kucharska o aplikacjach mobilnych.

Praca nad ekranem psuje się na etapie planu, nie pisania. Zacznij w Plan Mode, zatwierdź plan, który wymienia pliki i testy, a potem przełącz się na Agent mode, żeby implementować pod bramki. Kiedy przełączać tryby, wyjaśniają tryby agenta w Cursorze.

Wskaż w prompcie istniejące komponenty przez @, żeby Agent użył ich prawdziwych propsów zamiast wymyślać nowe. Jeśli projekt jest w Figmie, pracę z Figma MCP pokazuje budowanie UI frontendu z projektów; poniższy prompt korzysta z pisemnej specyfikacji.

Przeglądaj wynik w tej kolejności i zatrzymaj się na pierwszym problemie:

  1. Lista plików. Uruchom git diff --stat. Zadanie ekranowe dotyka ekranu, jego testu, nawigatora i pliku typów. Cokolwiek w ios/ lub android/ to zmiana natywna, o którą nie prosiłeś: zapytaj Agenta dlaczego, zanim pójdziesz dalej.
  2. Wyniki bramek. Wszystkie pięć poleceń przechodzi, a wyszukiwanie elementów webowych nic nie wypisało.
  3. Zrzuty ekranu. Dwa obrazy z otwartą klawiaturą. Pole bio jest widoczne na obu, a przycisk zapisu osiągalny.
  4. Testy. Otwórz tylko plik testów. To on jest specyfikacją; jeśli sprawdza to, o co prosiłeś, implementacji za nim nie trzeba czytać linia po linii.

Jeśli któryś krok zawiedzie, przywróć checkpoint sprzed tury implementacji, zamiast nakładać poprawki na złą bazę. Zobacz checkpointy i gałęzie.

Większość różnic między platformami to wartości, nie struktury. Wybierz najmniejsze narzędzie, które wyraża różnicę, bo każdy plik platformowy to drugie miejsce, w które musi trafić każda późniejsza poprawka.

RóżnicaUżyjDlaczego
Wartość: android_ripple, styl paska stanu, padding, grubość czcionki, opcja nagłówkaPlatform.select() w miejscuJeden plik, a różnica jest widoczna w przeglądzie
Komponent, który zachowuje się inaczej (date picker, haptyka, przepływ uprawnień)Component.ios.tsx i Component.android.tsx obok wspólnego typu propsówMetro ładuje najpierw plik platformowy; wspólny typ trzyma oba warianty w zgodzie
Coś, czego React Native nie udostępnia w APIModuł natywny (Expo Modules API lub Turbo Module)Wymaga przebudowy i recenzenta znającego Swift lub Kotlin; zobacz receptury natywne iOS i Android

Zrzuty „przed” są równie ważne jak „po”. Poprawka sprawdzona tylko po zmianie nie pokaże, czy Agent odtworzył zgłoszony przez ciebie błąd, czy zupełnie inny.

Debuguj Metro, buildy natywne i awarie tylko na urządzeniu

Dział zatytułowany „Debuguj Metro, buildy natywne i awarie tylko na urządzeniu”

Awarie mobilne często leżą poza kodem TypeScript: w cache’u Metro, CocoaPods, Gradle albo w brakującej przebudowie. Daj Agentowi pełny log i regułę, co wolno mu zmieniać, bo najszybszy sposób na zniknięcie błędu buildu to podbicie lub usunięcie zależności, a to rzadko jest poprawka, której chcesz.

Typowe pierwsze ruchy, które Agent powinien wykonać przed edycją jakiegokolwiek kodu:

ObjawPierwsze polecenie (terminal)
Unable to resolve module dla zainstalowanego pakietunpx expo start --clear (Expo) lub npx react-native start --reset-cache (czysty RN)
Build iOS pada po dodaniu pakietu natywnegonpx expo prebuild --clean (Expo prebuild) lub cd ios && pod install (czysty RN)
Build Androida pada po dodaniu pakietu natywnegocd android && ./gradlew clean, potem przebudowa
Zmiana w JavaScript działa, a zmiana natywna się nie pojawiaPrzebuduj aplikację; przeładowanie Metro nie ładuje kodu natywnego

Awarie występujące tylko na urządzeniu lub w buildzie release opisuje sekcja o debugowaniu buildów release w React Native DevTools, a ogólną pętlę „najpierw odtwórz” — polowanie na błędy w Cursorze.

Jak weryfikować zmiany mobilne bez czytania każdej linii?

Dział zatytułowany „Jak weryfikować zmiany mobilne bez czytania każdej linii?”

Każ Agentowi wytwarzać dowody i przeglądaj dowody. Lista „Done means” z reguły wymusza już większość z nich; ta tabela mówi, co łapie każda warstwa i kto za nią odpowiada.

WarstwaPolecenie lub artefaktCo łapieZatwierdza
Typy i lintnpx tsc --noEmit, npx expo lintZłe propsy, złe parametry nawigacji, nieużywany kodCI
Wyszukiwanie kodu webowegorg -n "<(div|span|img|button|p)[ >]" src appElementy HTML, których tsc nie odrzuca w projekcie React NativeCI
Zgodność zależnościnpx expo install --check (Expo)Pakiety natywne w wersjach, których SDK nie oczekujeCI
Testy jednostkowenpx jest --ci z React Native Testing LibraryZachowanie zapisane jako kryteria akceptacjiProgramista, który prowadził zadanie
Dowody z urządzeniaJeden zrzut na zmieniony ekran na platformę w evidence/<task>/Błędy układu, klawiatury, safe area i specyficzne dla platformyProgramista, który prowadził zadanie
Przepływy end-to-endPrzepływy Maestro w .maestro/ (zobacz wzorce testowania aplikacji mobilnych)Zepsutą nawigację, deep linki i bramki logowaniaCI, przy każdym pull requeście
Zmiany natywnegit diff --name-only | grep -E '^(ios|android)/' coś wypisujeNieproszone zmiany natywne, które wymagają przebudowy i recenzenta natywnegoTech lead lub właściciel części natywnej
WydanieStopniowy rollout w sklepie, a w Expo sprawdzenie fingerprintu przed każdą aktualizacją OTAZły build trafiający do wszystkich użytkownikówTech lead

W wyszukiwaniu kodu webowego podaj tylko foldery, które istnieją w repozytorium: rg kończy się kodem 2 przy brakującej ścieżce, takiej jak app, i bramka pada wtedy z niewłaściwego powodu. Na runnerze CI bez ripgrepa zainstaluj go albo uruchom grep -rnE z tym samym wzorcem.

Bramki, które nie potrzebują urządzenia, uruchamiaj w CI, żeby zielony pull request oznaczał już, że przeszły typy, lint, wyszukiwanie kodu webowego i testy jednostkowe; workflow pokazują pipeline’y CI/CD z Cursorem. Zrzuty ekranu trzymaj w opisie pull requesta, a jeśli zespół go przyjął, używaj formatu pakietu dowodów. Recenzent czyta wtedy, co zmieniło się w zachowaniu, a nie diff.

Co się psuje, gdy agent Cursora pracuje nad aplikacją mobilną?

Dział zatytułowany „Co się psuje, gdy agent Cursora pracuje nad aplikacją mobilną?”

Agent pisze kod webowy. Objaw: <div>, onClick, webowe klasy narzędziowe w className albo style={{ cursor: 'pointer' }} w ekranie. Przyczyna: reguła się nie załadowała: jej globs nie obejmują folderu, który Agent edytował, albo frontmatter jest błędny. Naprawa: popraw globy lub frontmatter, zacznij nowy czat, potwierdź załadowanie testem kanarkowym ze strony o regułach projektu i zostaw wyszukiwanie elementów webowych w CI, żeby kolejna wpadka zatrzymała build.

Poprawka trafia do złego pliku platformowego. Objaw: Agent edytował DatePicker.tsx, testy przechodzą, a na urządzeniu nic się nie zmienia. Przyczyna: istnieje DatePicker.ios.tsx, a Metro ładuje go najpierw. Naprawa: poproś Agenta o listę wariantów przez ls src/components/DatePicker*, nanieś poprawkę na każdy i zostaw w regule linię o plikach platformowych.

Zmiana natywna bez przebudowy. Objaw: Agent melduje, że funkcja działa, ale zrzut pokazuje stare zachowanie albo czerwony ekran „native module not found”. Przyczyna: Metro przeładował tylko JavaScript. Naprawa: przebuduj przez MobileBuildMCP albo npx expo run:android i wymagaj świeżego zrzutu po przebudowie.

Agent „naprawia” build, zmieniając wersje. Objaw: build jest zielony, a package.json lub lockfile się zmienił. Naprawa: przywróć checkpoint, uruchom ponownie prompt diagnozy buildu z zakazem zmiany wersji i zostaw w CI bramkę npx expo install --check, żeby niedopasowany pakiet natywny głośno padał.

Przetestowano tylko jedną platformę. Objaw: podsumowanie ma zrzuty z jednego symulatora. Przyczyna: Agent użył urządzenia, które akurat było uruchomione. Naprawa: odrzuć wynik i poproś o brakującą platformę; lista „Done means” wymienia obie, więc to złamanie reguły, na które możesz się powołać.

Serwer MCP nie widzi urządzenia. Objaw: pusta lista urządzeń albo „no booted simulator”. Naprawa: uruchom symulator w Xcode lub emulator w Android Studio, sprawdź adb devices dla Androida i poproś Agenta o ponowne wylistowanie urządzeń. Na maszynie bez Xcode MobileBuildMCP w ogóle nie zbuduje iOS; używaj mobile-mcp z Androidem, a iOS sprawdzaj na Macu kolegi lub w CI.

Typy nawigacji się rozjeżdżają. Objaw: tsc zgłasza błąd przy navigation.navigate('Profile', …) po dodaniu ekranu. Przyczyna: Agent zarejestrował ekran, ale nie zaktualizował RootStackParamList. Naprawa: wskaż w prompcie src/navigation/types.ts przez @; reguła już go wymienia, więc jeśli się nie załadowała, powtórz prompt w nowym czacie.