Materiały źródłowe do tej serii: 1. Nowa aplikacja: https://aleksanderfigiel.pl/ios-new-app-tutorial-1 2. TestFlight: https://aleksanderfigiel.pl/ios-testflight-tutorial-2 3. Instalacja przez kabel: https://aleksanderfigiel.pl/ios-macos-cable-tutorial-3 Przed rozpoczęciem otwórz i przeczytaj stronę części, której dotyczy ten prompt. Korzystaj z jej instrukcji, ilustracji i kodu. Pozostałe części traktuj jako kontekst i sięgaj do nich, gdy wymaga tego bieżący krok. Zachowaj zakres tej części i prowadź mnie po jednym kroku. Jeśli nie masz dostępu do strony lub nie została jeszcze opublikowana, powiedz o tym i poproś o jej treść albo pliki; nie udawaj, że ją przeczytałeś. Poprowadź mnie po polsku, po jednym małym kroku na wiadomość, przez TestFlight według dołączonego tutorialu 2. Celem jest pierwszy udany upload, zaproszenie mnie jako testera wewnętrznego, instalacja na iPhonie i kolejna aktualizacja. Nie publikuj aplikacji w publicznym App Store. Nie używaj znaku em dash. Zacznij od ustalenia systemu: macOS, Windows lub Linux, oraz adresu mojego repozytorium GitHub. Ustal już zarejestrowany Bundle ID i rekord aplikacji, nazwę projektu/schematu oraz używanie XcodeGen. Nie zakładaj, że przykłady TestowaApka, pl.jankowalski.testowaapka lub jankowalski/testowa-apka są moimi danymi. Zachowuj potwierdzone wartości i generuj konkretne linki https://github.com/OWNER/REPO/settings/variables/actions oraz https://github.com/OWNER/REPO/settings/secrets/actions. Nie powtarzaj pytań, gdy odpowiedź jest w kontekście. Wyjaśnij: tester potrzebuje TestFlight z https://apps.apple.com/pl/app/testflight/id899247664 i iPhone'a, nie Maca. Klucz i CSR można przygotować na każdym systemie; certyfikat wystawia Apple, a kompilację i podpisywanie wykonuje runner macOS w GitHub Actions. Wymagane są Apple Developer Program i gotowy kod aplikacji. Kieruj do tutorialu 1, jeśli brakuje App ID/rekordu. Nie twórz duplikatów zasobów. Korzystaj z odpowiedniej zakładki systemowej. macOS: Keychain Access, Certificate Assistant, CSR zapisany na dysku; Apple Distribution w portalu; pobranie .cer; import na komputerze z prywatnym kluczem; eksport certyfikatu z kluczem do .p12 z hasłem. Windows: Git Bash + OpenSSL, MSYS_NO_PATHCONV=1 dla -subj. Linux: OpenSSL. W obu utwórz zaszyfrowany klucz RSA 2048 i CSR, prześlij CSR do Apple, pobierz .cer, przekonwertuj DER do PEM i wyeksportuj .p12. Ścieżki Windows/Linux są opracowane z dokumentacji, nie deklaruj ich osobistego przetestowania. Nie zalecaj bezwarunkowego Always Trust. W naszym teście domyślne zaufanie na Macu wystarczyło, bo CI ma poprawny łańcuch WWDR. Wspólne kroki: Profiles +, Distribution > App Store Connect, właściwy App ID, właściwy Apple Distribution, nazwa i Generate, Download .mobileprovision. Nie wybieraj Development/Ad Hoc i nie żądaj UDID do TestFlight. Następnie Users and Access > Integrations > App Store Connect API > Team Keys > Generate API Key, nazwa GitHub TestFlight, Access Developer. W tym wariancie używamy ręcznego podpisywania gotowym .p12 i profilem. Pobierz .p8 tylko raz i zachowaj bezpiecznie; skopiuj Key ID i Issuer ID. Repository Variables: XCODE_PROJECT (bez rozszerzenia, wspólna nazwa projektu i schematu), APPLE_TEAM_ID, ASC_KEY_ID, ASC_ISSUER_ID. Repository Secrets: DISTRIBUTION_CERTIFICATE_P12_BASE64, DISTRIBUTION_CERTIFICATE_PASSWORD, APP_STORE_PROVISIONING_PROFILE_BASE64, ASC_PRIVATE_KEY. Nigdy nie proś mnie o przesłanie prywatnego klucza, .p12, hasła ani zawartości sekretów do czatu. Wyjaśnij różnicę Repository/Environment/Organization: Environment dotyczy jednego repozytorium i wymaga environment w jobie; współdzielenie pomiędzy repozytoriami to Organization, zależnie od planu. Na Macu pokazuj konkretne ścieżki, np. base64 -i ~/Desktop/AppleDistribution.p12 | pbcopy i base64 -i ~/Desktop/TestowaApkaAppStore.mobileprovision | pbcopy. Dopasuj nazwę do pliku użytkownika. .p8 kopiujemy jako zwykły tekst, np. cat ~/Downloads/AuthKey_KEYID.p8 | pbcopy. Alternatywa: edytor tekstu, zaznacz wszystko, kopiuj. Wyraźnie wymagaj obu linii -----BEGIN PRIVATE KEY----- i -----END PRIVATE KEY-----, to znaczniki PEM, nie opcjonalne komentarze. Dla Windows podaj PowerShell ReadAllBytes/ToBase64String/Set-Clipboard, a .p8 Get-Content -Raw; dla Linux base64 -w 0 do pliku. Base64 nie jest szyfrowaniem. Przed zmianami kodu przeczytaj AGENTS.md i istniejące workflow. Użyj obu dołączonych plików code/.github/workflows/testflight.yml oraz code/scripts/prepare-testflight-export.py. Nie pomiń helpera. Dostosuj do faktycznej struktury projektu; nie zmieniaj Bundle ID istniejącej aplikacji bez zgody. Ten wariant zakłada jedną aplikację, XcodeGen oraz wspólną nazwę projektu/schematu; rozszerzenia i Watch wymagają adaptacji. Nie twórz certyfikatów przy każdym buildzie. Kod używa manual export signing, bez -allowProvisioningUpdates. WWDR import obsługuje konkretny duplikat, inne błędy zatrzymują job. Nie wpisuj prywatnych danych w workflow i nie dodawaj plików kluczy do git. Uruchomienie: Actions > Build and upload to TestFlight > Run workflow, wybór gałęzi. Domyślnie ręcznie. Push z [testflight] w wiadomości ostatniego commita uruchamia job automatycznie, także po commicie przez agenta AI. Push bez znacznika pomija job. Nie podawaj niepotwierdzonego limitu 30 uploadów dziennie jako faktu. Nowe uruchomienie zwiększa GITHUB_RUN_NUMBER, Re-run zachowuje go. Nie uruchamiaj pętli CI i nie czekaj na statusy w pętli, jeśli AGENTS tego zabrania. Po zielonym workflow: App Store Connect > aplikacja > TestFlight > iOS > Build Uploads. Poczekaj na Processing > Complete; około 2-3 minut w naszym przykładzie, nie gwarancja. Uzupełnij compliance tylko zgodnie z prawdziwymi funkcjami aplikacji. Utwórz grupę Internal Testers z Enable automatic distribution. Dodaj własne konto przez Testers + / Invite Testers > Add; upewnij się, że grupa ma build, w razie potrzeby Add Builds. Nie każ wykonywać Beta App Review dla tego scenariusza testów wewnętrznych. Na telefonie otwórz mail > View in TestFlight > akceptacja > Zainstaluj. Po instalacji Otwórz. Przy kolejnym buildzie i Complete pojawia się Uaktualnij, o ile build jest udostępniony grupie. W szczegółach aplikacji można wyłączyć Powiadomienia e-mail, pozostawiając push i Uaktualnienia automatyczne. Grupa automatycznej dystrybucji i aktualizacje na telefonie to osobne opcje. Po każdym kroku czekaj na potwierdzenie lub screenshot; oceniaj realny stan, nie zakładaj sukcesu. Przy błędzie czytaj konkretny log, nie zmieniaj roli na Admin bez analizy. Jeżeli masz internet, weryfikuj aktualne wymagania Apple/GitHub. Na końcu podsumuj faktycznie zakończone kroki. Tutorial 3 o kablu jest osobnym tematem. Nie generuj nowego HTML podczas prowadzenia mnie, chyba że poproszę.