{"id":42201,"date":"2019-03-18T00:00:00","date_gmt":"2019-03-17T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/publikuem-prilozheniya-ios-v-app-store-s-gitlab-i-fastlane"},"modified":"2020-02-18T13:45:01","modified_gmt":"2020-02-18T10:45:01","slug":"publikuem-prilozheniya-ios-v-app-store-s-gitlab-i-fastlane","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/publikuem-prilozheniya-ios-v-app-store-s-gitlab-i-fastlane","title":{"rendered":"Wir ver\u00f6ffentlichen iOS-Apps im App Store mit GitLab und fastlane","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Wir ver\u00f6ffentlichen iOS-Apps im App Store mit GitLab und fastlane\" src=\"\/wp-content\/uploads\/2019\/03\/a82a2584dfa78743d9e91e399939061f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wie GitLab mit fastlane iOS-Anwendungen f\u00fcr den App Store erstellt, signiert und ver\u00f6ffentlicht.<\/p>\n<p><\/p>\n<p>K\u00fcrzlich hatten wir einen <noindex><a rel=\"nofollow\" href=\"https:\/\/about.gitlab.com\/2019\/01\/28\/android-publishing-with-gitlab-and-fastlane\/\">Beitrag dar\u00fcber, wie man schnell eine Android-Anwendung<\/a><\/noindex> mit GitLab und <noindex><a rel=\"nofollow\" href=\"https:\/\/fastlane.tools\/\">fastlane<\/a><\/noindex>aufsetzt. Hier sehen wir, wie man eine iOS-Anwendung erstellt und sie in TestFlight ver\u00f6ffentlicht. Schaut mal, wie cool <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=325FyJt7ZG8\">ich eine \u00c4nderung auf dem iPad Pro mit GitLab Web IDE einf\u00fchre,<\/a><\/noindex>die Build-Ausgabe anfordere und das Update der Testversion der Anwendung auf demselben iPad Pro erhalte, auf dem ich sie entwickelt habe.<\/p>\n<p><\/p>\n<p>Hier nehmen wir <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/jlenny\/flappyokr\">eine einfache iOS-Anwendung auf Swift<\/a><\/noindex>, mit der ich ein Video aufgenommen habe.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"para-slov-o-konfiguracii-apple-store\">Ein paar Worte zur Apple Store-Konfiguration<\/h3>\n<p><\/p>\n<p>Wir ben\u00f6tigen eine App im App Store, Verteilungssignierungszertifikate und ein Initialisierungsprofil, um alles miteinander zu verkn\u00fcpfen.<\/p>\n<p><\/p>\n<p>Das Schwierigste dabei ist, die Signaturrechte im App Store einzurichten. Ich hoffe, das bekommen Sie selbst hin. Wenn Sie neu sind, werde ich Ihnen den richtigen Weg zeigen, aber hier werden wir nicht \u00fcber die Feinheiten der Verwaltung von Apple-Zertifikaten sprechen, da sich diese st\u00e4ndig \u00e4ndern. Dieser Beitrag hilft Ihnen, den Einstieg zu finden.<\/p>\n<p><\/p>\n<h3 id=\"moi-prilozheniya\">Meine Anwendungen<\/h3>\n<p><\/p>\n<p>Es wird eine App im App Store Connect ben\u00f6tigt, damit Sie eine ID zur Konfiguration haben. <code>.xcodebuild<\/code>. Das Profil und die App-ID kombinieren den Code, die Preise und die Verf\u00fcgbarkeit sowie die TestFlight-Konfiguration f\u00fcr die Verteilung von Testanwendungen an Benutzer. F\u00fchren Sie kein \u00f6ffentliches Testing durch; private Tests reichen aus, wenn Sie eine kleine Gruppe haben, eine einfache Einrichtung ben\u00f6tigen und keine zus\u00e4tzlichen Genehmigungen von Apple erforderlich sind.<\/p>\n<p><\/p>\n<h3 id=\"profil-inicializacii\">Initialisierungsprofil<\/h3>\n<p><\/p>\n<p>Neben der App-Einrichtung ben\u00f6tigen Sie Ver\u00f6ffentlichungs- und Entwicklungs-Keys f\u00fcr iOS, die im Abschnitt Certificates, Identifiers &amp; Profiles (Zertifikate, Identifikatoren und Profile) in der Apple Developer Konsole erstellt werden. Alle diese Zertifikate k\u00f6nnen im Initialisierungsprofil geb\u00fcndelt werden.<\/p>\n<p><\/p>\n<p>Benutzer, die sich authentifizieren m\u00f6chten, ben\u00f6tigen die M\u00f6glichkeit, Zertifikate zu erstellen; sonst sehen Sie bei den Phasen <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-cert-and-sigh\">cert und sigh<\/a><\/noindex> einen Fehler.<\/p>\n<p><\/p>\n<h3 id=\"drugie-varianty\">Weitere Optionen<\/h3>\n<p><\/p>\n<p>Neben dieser einfachen Methode gibt es auch andere M\u00f6glichkeiten, Zertifikate und Profile einzurichten. Wenn Sie also anders arbeiten, m\u00fcssen Sie m\u00f6glicherweise umdenken. Am wichtigsten ist, dass Sie eine Konfiguration ben\u00f6tigen. <code>.xcodebuild<\/code>, die auf die ben\u00f6tigten Dateien verweist, und die Schl\u00fcsselverbindung muss auf dem Computer des Benutzers verf\u00fcgbar sein, unter dessen Namen der Runner arbeitet. F\u00fcr die digitale Signatur verwenden wir Fastlane, und wenn es Probleme gibt oder Sie mehr erfahren m\u00f6chten, lesen Sie deren ausf\u00fchrliche <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/\">Dokumentation zu digitalen Signaturen<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>In diesem Beispiel benutze ich einen Ansatz <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-cert-and-sigh\">cert und sigh<\/a><\/noindex>, aber f\u00fcr die praktische Anwendung w\u00e4re wahrscheinlich besser geeignet <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-match\">Match<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h2 id=\"podgotovka-gitlab-i-fastlane\">Vorbereitung von GitLab und Fastlane<\/h2>\n<p><\/p>\n<h3 id=\"podgotovka-ci-runner\">Vorbereitung des CI-Runners<\/h3>\n<p><\/p>\n<p>Nachdem wir all diese Daten gesammelt haben, gehen wir zur Konfiguration des GitLab-Runners auf dem macOS-Ger\u00e4t \u00fcber. Leider ist die Entwicklung von iOS-Anwendungen tats\u00e4chlich nur auf macOS m\u00f6glich. Aber das kann sich \u00e4ndern, und wenn Sie Entwicklungen in diesem Bereich erwarten, verfolgen Sie Projekte wie <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/facebook\/xcbuild\">Xcbuild<\/a><\/noindex> \u0438 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/saucelabs\/isign\">Isign<\/a><\/noindex>, und unsere interne Aufgabe <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/gitlab-org\/gitlab-ce\/issues\/57576\">gitlab-ce#57576<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Die Einrichtung des Runners ist sehr einfach. Folgen Sie den aktuellen <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/runner\/install\/osx.html\">Einrichtungsanweisungen f\u00fcr GitLab Runner auf macOS<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Hinweis: Der Runner muss das ausf\u00fchrbare Programm <code>Shell<\/code>. verwenden. Dies ist f\u00fcr den iOS-Bau auf macOS unbedingt erforderlich, um direkt als Benutzer und nicht \u00fcber Container zu arbeiten. Wenn Sie verwenden <code>Shell<\/code>, die Erstellung und Tests erfolgen im Namen des Benutzers des Runners direkt auf dem Build-Host. Dies ist nicht so sicher wie Container, also scrollen Sie besser nach unten. <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/runner\/security\/#usage-of-shell-executor\">Sicherheitsdokumentation<\/a><\/noindex>, um nichts zu \u00fcbersehen.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">sudo curl --output \/usr\/local\/bin\/gitlab-runner https:\/\/gitlab-runner-downloads.s3.amazonaws.com\/latest\/binaries\/gitlab-runner-darwin-amd64\nsudo chmod +x \/usr\/local\/bin\/gitlab-runner\ncd ~\ngitlab-runner install\ngitlab-runner start<\/code><\/pre>\n<p><\/p>\n<p>Der Apple-Schl\u00fcsselbund muss auf diesem Host konfiguriert werden, um Zugriff auf die Schl\u00fcssel zu haben, die Xcode f\u00fcr den Build ben\u00f6tigt. Der einfachste Weg, dies zu testen, besteht darin, sich als Benutzer anzumelden, der den Build ausf\u00fchren wird, und versuchen, den Build manuell auszuf\u00fchren. Wenn das System den Zugriff auf den Schl\u00fcsselbund anfordert, w\u00e4hlen Sie \u201eImmer erlauben\u201c, damit CI funktioniert. Es kann sinnvoll sein, sich anzumelden und die ersten paar Pipelines zu beobachten, um sicherzustellen, dass sie nicht mehr nach dem Schl\u00fcsselbund fragen. Das Problem ist, dass Apple es uns nicht einfach macht, dies im automatischen Modus zu handhaben, aber sobald Sie es eingerichtet haben, wird alles gut sein.<\/p>\n<p><\/p>\n<h3 id=\"fastlane-init\">fastlane init<\/h3>\n<p><\/p>\n<p>Um fastlane im Projekt zu verwenden, f\u00fchren Sie aus <code>fastlane init<\/code>. Folgen Sie einfach <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/getting-started\/ios\/setup\/\">den Installations- und Ausf\u00fchrungsanweisungen f\u00fcr fastlane<\/a><\/noindex>, insbesondere im Abschnitt \u00fcber <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/getting-started\/ios\/setup\/#use-a-gemfile\">Gemfile<\/a><\/noindex>, denn wir ben\u00f6tigen einen schnellen und vorhersehbaren Start \u00fcber die automatische CI-Pipeline.<\/p>\n<p><\/p>\n<p>F\u00fchren Sie diese Befehle im Projektverzeichnis aus:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">xcode-select --install\nsudo gem install fastlane -NV\n# Alternativ mit Homebrew\n# brew cask install fastlane\nfastlane init<\/code><\/pre>\n<p><\/p>\n<p>Fastlane wird nach der grundlegenden Konfiguration fragen und dann im Projektordner fastlane mit drei Dateien erstellen:<\/p>\n<p><\/p>\n<p><strong><code>1. fastlane\/Appfile<\/code><\/strong><\/p>\n<p><\/p>\n<p>Hier ist nichts kompliziert. \u00dcberpr\u00fcfen Sie einfach, dass die Apple-ID und die App-ID korrekt angegeben sind.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">app_identifier(\"com.vontrance.flappybird\") # Der Bundle-Identifier Ihrer App\napple_id(\"your-email@your-domain.com\") # Ihre Apple-E-Mail-Adresse<\/code><\/pre>\n<p><\/p>\n<p><strong><code>2. fastlane\/Fastfile<\/code><\/strong><\/p>\n<p><\/p>\n<p><code>Fastfile<\/code> definiert die Schritte im Build-Prozess. Wir nutzen viele integrierte Funktionen von Fastlane, daher ist alles auch hier klar. Wir erstellen eine Zeile, die die Zertifikate abruft, das Build ausf\u00fchrt und in TestFlight hochl\u00e4dt. Sie k\u00f6nnen diesen Prozess in verschiedene Aufgaben aufteilen, wenn n\u00f6tig. Alle diese Operationen (<code>get_certificates<\/code>, <code>get_provisioning_profile<\/code>, <code>gym<\/code> \u0438 <code>upload_to_testflight<\/code>) sind bereits in Fastlane enthalten.<\/p>\n<p><\/p>\n<p>Aktionen <code>get_certificates<\/code> \u0438 <code>get_provisioning_profile<\/code> sind mit der Signaturmethode verbunden <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-cert-and-sigh\">cert und sigh<\/a><\/noindex>. Wenn Sie <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-match\">Match<\/a><\/noindex> oder etwas anderes verwenden, nehmen Sie \u00c4nderungen vor.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">default_platform(:ios)\n\nplatform :ios do\n  desc \"Baue die Anwendung\"\n  lane :flappybuild do\n    get_certificates\n    get_provisioning_profile\n    gym\n    upload_to_testflight\n  end\nend<\/code><\/pre>\n<p><\/p>\n<p><strong><code>3. fastlane\/Gymfile<\/code><\/strong><\/p>\n<p><\/p>\n<p>Dies ist eine optionale Datei, die ich manuell erstellt habe, um das Standard-Ausgabeverzeichnis zu \u00e4ndern und die Ausgaben im aktuellen Ordner abzulegen. Das erleichtert die CI. Wenn Sie interessiert sind, lesen Sie \u00fcber <code>gym<\/code> und seine Optionen in <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/actions\/gym\/\">Dokumentation.<\/a><\/noindex>.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">https:\/\/docs.fastlane.tools\/actions\/gym\/<\/code><\/pre>\n<p><\/p>\n<p>Unser <strong><code>.gitlab-ci.yml<\/code><\/strong><\/p>\n<p><\/p>\n<p>Also, wir haben einen CI-Runner f\u00fcr das Projekt, und wir sind bereit, die Pipeline zu testen. Schauen wir, was wir in <code>.gitlab-ci.yml<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">stages:\n  - build\n\nvariables:\n  LC_ALL: \"de_DE.UTF-8\"\n  LANG: \"de_DE.UTF-8\"\n  GIT_STRATEGY: clone\n\nbuild:\n  stage: build\n  script:\n    - bundle install\n    - bundle exec fastlane flappybuild\n  artifacts:\n    paths:\n    - .\/FlappyBird.ipa<\/code><\/pre>\n<p><\/p>\n<p>Alles bestens! <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/getting-started\/ios\/setup\/#set-up-environment-variables\">Wir setzen das UTF-8-Format f\u00fcr fastlane, wie erforderlich<\/a><\/noindex>, verwenden die Strategie <code>clone<\/code> mit dem Executable <code>Shell<\/code>, damit wir ein sauberes Arbeitsumfeld f\u00fcr jeden Build haben, und rufen einfach <code>flappybuild<\/code> fastlane, wie oben sichtbar. Am Ende erhalten wir den Build, die Signatur und den Deployment der letzten Version in TestFlight.<\/p>\n<p><\/p>\n<p>Au\u00dferdem erhalten wir ein Artefakt und speichern es zusammen mit dem Build. Beachten Sie, dass das Format <code>.ipa<\/code> eine signierte ARM-Executable ist, die im Simulator nicht ausgef\u00fchrt werden kann. Wenn Sie die Ausgaben f\u00fcr den Simulator w\u00fcnschen, f\u00fcgen Sie einfach das Build-Ziel hinzu, das es erstellt, und binden Sie es dann in den Artefaktpfad ein.<\/p>\n<p><\/p>\n<h3 id=\"drugie-peremennye-sredy\">Weitere Umgebungsvariablen<\/h3>\n<p><\/p>\n<p>Hier gibt es ein paar Umgebungsvariablen, auf denen alles l\u00e4uft.<\/p>\n<p><\/p>\n<p><strong><code>FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD<\/code><\/strong> \u0438 <strong><code>FASTLANE_SESSION<\/code><\/strong><\/p>\n<p><\/p>\n<p>F\u00fcr die Authentifizierung im App Store und das Hochladen in TestFlight ben\u00f6tigen Sie eine Authentifizierung f\u00fcr fastlane. Erstellen Sie daf\u00fcr ein Anwendungspasswort, das in CI verwendet wird. Weitere Informationen <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/best-practices\/continuous-integration\/#use-of-application-specific-passwords-and-spaceauth\">hier<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Wenn Sie die Zwei-Faktor-Authentifizierung aktiviert haben, erstellen Sie eine Variable <code>FASTLANE_SESSION<\/code> (die Anweisungen finden Sie dort auch).<\/p>\n<p><\/p>\n<p><strong><code>FASTLANE_USER<\/code><\/strong> \u0438 <strong><code>FASTLANE_PASSWORD<\/code><\/strong><\/p>\n<p><\/p>\n<p>Um <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-cert-and-sigh\">cert und sigh<\/a><\/noindex> F\u00fcr die initialisierende Profil- und Zertifikatsanforderung m\u00fcssen Variablen festgelegt werden <code>FASTLANE_USER<\/code> \u0438 <code>FASTLANE_PASSWORD<\/code>. Weitere Informationen <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/best-practices\/continuous-integration\/#environment-variables-to-set\">hier<\/a><\/noindex>. Dies ist nicht notwendig, wenn Sie ein anderes Signierungsverfahren verwenden.<\/p>\n<p><\/p>\n<h3 id=\"v-zaklyuchenie\">Zusammenfassung<\/h3>\n<p><\/p>\n<p>Sie k\u00f6nnen sehen, wie das Ganze funktioniert <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/jlenny\/flappyokr\">in meinem einfachen Beispiel<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Ich hoffe, das war hilfreich und hat Sie inspiriert, mit iOS-Builds in Ihrem GitLab-Projekt zu arbeiten. Hier sind noch einige <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/best-practices\/continuous-integration\/\">Tipps f\u00fcr CI<\/a><\/noindex> f\u00fcr fastlane, f\u00fcr den Fall, dass Sie <code>CI_BUILD_ID<\/code> (f\u00fcr inkrementelle Builds) verwenden m\u00f6chten, um <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/best-practices\/continuous-integration\/gitlab\/#auto-incremented-build-number\">die Version automatisch zu inkrementieren<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Eine weitere coole Funktion von fastlane ist <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/getting-started\/ios\/screenshots\/\">Automatisierte Screenshots<\/a><\/noindex> f\u00fcr den App Store, die ganz einfach einzurichten sind.<\/p>\n<p><\/p>\n<p>Teilen Sie Ihre Erfahrungen in den Kommentaren und bringen Sie Ideen zur Verbesserung von GitLab f\u00fcr die Entwicklung von iOS-Anwendungen ein.<\/p>\n<p>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/444170\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041a\u0430\u043a GitLab \u0441 fastlane \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442, \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f iOS \u0432 App Store. \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b \u043f\u043e\u0441\u0442 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Android \u0441 GitLab \u0438 fastlane. \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c, \u043a\u0430\u043a \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 iOS \u0438 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432 TestFlight. \u0417\u0430\u0446\u0435\u043d\u0438\u0442\u0435, \u043a\u0430\u043a \u043a\u0440\u0443\u0442\u043e \u044f \u0432\u043d\u043e\u0448\u0443 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 iPad Pro [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":42202,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-42201","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041a\u0430\u043a GitLab \u0441 fastlane \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442, \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f iOS \u0432 App Store. \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b \u043f\u043e\u0441\u0442 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Android \u0441 GitLab \u0438 fastlane. \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c, \u043a\u0430\u043a \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 iOS \u0438 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432 TestFlight. \u0417\u0430\u0446\u0435\u043d\u0438\u0442\u0435, \u043a\u0430\u043a \u043a\u0440\u0443\u0442\u043e \u044f \u0432\u043d\u043e\u0448\u0443 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 iPad Pro\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/publikuem-prilozheniya-ios-v-app-store-s-gitlab-i-fastlane\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f iOS \u0432 App Store \u0441 GitLab \u0438 fastlane | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041a\u0430\u043a GitLab \u0441 fastlane \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442, \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f iOS \u0432 App Store. \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b \u043f\u043e\u0441\u0442 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Android \u0441 GitLab \u0438 fastlane. \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c, \u043a\u0430\u043a \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 iOS \u0438 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432 TestFlight. \u0417\u0430\u0446\u0435\u043d\u0438\u0442\u0435, \u043a\u0430\u043a \u043a\u0440\u0443\u0442\u043e \u044f \u0432\u043d\u043e\u0448\u0443 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 iPad Pro\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/publikuem-prilozheniya-ios-v-app-store-s-gitlab-i-fastlane\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-03-17T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T10:45:01+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Ver\u00f6ffentlichen Sie iOS-Anwendungen im App Store mit GitLab und fastlane | ProHoster","description":"Wie GitLab mit fastlane iOS-Anwendungen f\u00fcr den App Store erstellt, signiert und ver\u00f6ffentlicht. K\u00fcrzlich haben wir dar\u00fcber berichtet, wie man schnell eine Android-App mit GitLab und fastlane erstellt und startet. Hier zeigen wir, wie man eine iOS-App erstellt, sie in TestFlight ver\u00f6ffentlicht und bewertet, wie cool ich \u00c4nderungen auf dem iPad Pro vornehme.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/publikuem-prilozheniya-ios-v-app-store-s-gitlab-i-fastlane","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f iOS \u0432 App Store \u0441 GitLab \u0438 fastlane | ProHoster","og:description":"\u041a\u0430\u043a GitLab \u0441 fastlane \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442, \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f iOS \u0432 App Store. \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b \u043f\u043e\u0441\u0442 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Android \u0441 GitLab \u0438 fastlane. \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c, \u043a\u0430\u043a \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 iOS \u0438 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432 TestFlight. \u0417\u0430\u0446\u0435\u043d\u0438\u0442\u0435, \u043a\u0430\u043a \u043a\u0440\u0443\u0442\u043e \u044f \u0432\u043d\u043e\u0448\u0443 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 iPad Pro","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/publikuem-prilozheniya-ios-v-app-store-s-gitlab-i-fastlane","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-03-17T21:00:00+00:00","article:modified_time":"2020-02-18T10:45:01+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"42201","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-22 07:36:23","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 18:23:50","updated":"2026-01-22 07:36:23"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/42201","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=42201"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/42201\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/42202"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=42201"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=42201"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=42201"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}