{"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\/da\/blog\/administrirovanie\/publikuem-prilozheniya-ios-v-app-store-s-gitlab-i-fastlane","title":{"rendered":"Publicering af iOS-apps i App Store med GitLab og fastlane","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Publicering af iOS-apps i App Store med GitLab og fastlane\" src=\"\/wp-content\/uploads\/2019\/03\/a82a2584dfa78743d9e91e399939061f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hvordan GitLab med fastlane bygger, signer og offentligg\u00f8r iOS-applikationer i App Store.<\/p>\n<p><\/p>\n<p>For nylig havde vi en <noindex><a rel=\"nofollow\" href=\"https:\/\/about.gitlab.com\/2019\/01\/28\/android-publishing-with-gitlab-and-fastlane\/\">artikel om, hvordan man hurtigt bygger og lancerer en Android-applikation<\/a><\/noindex> med GitLab og <noindex><a rel=\"nofollow\" href=\"https:\/\/fastlane.tools\/\">fastlane.<\/a><\/noindex>Her vil vi se, hvordan man bygger og lancerer en iOS-applikation og publicerer den i TestFlight. Tjek hvor fantastisk <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=325FyJt7ZG8\">jeg laver \u00e6ndringer p\u00e5 iPad Pro med GitLab Web IDE<\/a><\/noindex>, tager en bygning og f\u00e5r en opdatering af testversionen af applikationen p\u00e5 den samme iPad Pro, hvor jeg udviklede den.<\/p>\n<p><\/p>\n<p>Her vil vi tage <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/jlenny\/flappyokr\">en simpel iOS-applikation skrevet i Swift<\/a><\/noindex>, som jeg optog video med.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"para-slov-o-konfiguracii-apple-store\">Et par ord om konfigurationen af Apple Store<\/h3>\n<p><\/p>\n<p>Vi har brug for en applikation i App Store, distributionstilladelser og et initialiseringsprofil for at binde det hele sammen.<\/p>\n<p><\/p>\n<p>Det sv\u00e6reste her er at konfigurere signeringsrettighederne i App Store. Jeg h\u00e5ber, at I kan finde ud af det selv. Hvis du er ny, angiver jeg den rigtige retning, men vi vil ikke diskutere detaljerne omkring Apples certifikatadministration her, og desuden \u00e6ndrer de sig hele tiden. Dette indl\u00e6g hj\u00e6lper dig med at komme i gang.<\/p>\n<p><\/p>\n<h3 id=\"moi-prilozheniya\">Mine appliaktioner<\/h3>\n<p><\/p>\n<p>Du har brug for en applikation i App Store Connect for at f\u00e5 et ID til konfigurationen <code>.xcodebuild<\/code>. Profil og app-ID forbinder kodebygninger, priser og tilg\u00e6ngelighed, samt TestFlight-konfigurationen til distribution af testapplikationer til brugerne. Undlad at lave offentlig testning; privat testning er tilstr\u00e6kkeligt, hvis du har en lille gruppe, enkel ops\u00e6tning og ikke har brug for yderligere tilladelser fra Apple.<\/p>\n<p><\/p>\n<h3 id=\"profil-inicializacii\">Initialiseringsprofil<\/h3>\n<p><\/p>\n<p>Udover ops\u00e6tningen af applikationen har du brug for distributions- og udviklingsn\u00f8gler til iOS, som er oprettet i sektionen Certificates, Identifiers &amp; Profiles (Certifikater, identifikatorer og profiler) i Apple Developer-konsollen. Alle disse certifikater kan samles i en initialiseringsprofil.<\/p>\n<p><\/p>\n<p>Brugere, der skal autentificeres, har brug for muligheden for at oprette certifikater, ellers vil du se en fejl p\u00e5 trinene <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-cert-and-sigh\">cert og sigh.<\/a><\/noindex> Andre muligheder<\/p>\n<p><\/p>\n<h3 id=\"drugie-varianty\">Udover denne enkle metode er der andre m\u00e5der at konfigurere certifikater og profiler p\u00e5. S\u00e5 hvis du arbejder anderledes, kan det v\u00e6re n\u00f8dvendigt at omarrangere. Det vigtigste er, at du har brug for en konfiguration<\/h3>\n<p><\/p>\n<p>, som peger p\u00e5 de n\u00f8dvendige filer, og n\u00f8glek\u00e6den skal v\u00e6re tilg\u00e6ngelig p\u00e5 bygningens computer for brugeren, hvis navn runneren k\u00f8rer under. Til digital signatur bruger vi fastlane, og hvis der er problemer, eller hvis du vil vide mere, s\u00e5 unders\u00f8g deres detaljerede dokumentation. <code>.xcodebuild<\/code>, som vil pege p\u00e5 de n\u00f8dvendige filer, og n\u00f8glebindet skal v\u00e6re tilg\u00e6ngeligt p\u00e5 bygningens computer for den bruger, under hvis navn runneren k\u00f8rer. Til digital signatur bruger vi fastlane, og hvis der er problemer, eller hvis du vil vide mere, skal du studere deres detaljerede <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/\">dokumentation om digitale signaturer<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>I dette eksempel bruger jeg en tilgang <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-cert-and-sigh\">cert og sigh.<\/a><\/noindex>, men til rigtig anvendelse vil det nok v\u00e6re bedre at bruge <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\">Forberedelse af GitLab og fastlane<\/h2>\n<p><\/p>\n<h3 id=\"podgotovka-ci-runner\">Forberedelse af CI Runner<\/h3>\n<p><\/p>\n<p>N\u00e5r vi har samlet alle disse data, g\u00e5r vi videre til konfigurationen af GitLab-runneren p\u00e5 en MacOS-enhed. Desv\u00e6rre kan man kun udvikle iOS-apps p\u00e5 MacOS. Men alt kan \u00e6ndre sig, s\u00e5 hvis du venter p\u00e5 fremskridt p\u00e5 dette omr\u00e5de, \u2014 f\u00f8lg projekter som <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/facebook\/xcbuild\">xcbuild<\/a><\/noindex> og <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/saucelabs\/isign\">isign<\/a><\/noindex>, og vores interne opgave <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>Det er meget nemt at konfigurere runneren. F\u00f8lg de aktuelle <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/runner\/install\/osx.html\">instruktioner til ops\u00e6tning af GitLab Runner i macOS<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Bem\u00e6rk: Runneren skal bruge programmet <code>shell<\/code>. Dette er n\u00f8dvendigt for at bygge iOS i macOS, s\u00e5 det fungerer direkte som en bruger og ikke gennem containere. Hvis du bruger <code>shell<\/code>, udf\u00f8res bygning og testning p\u00e5 vegne af runnerens bruger, direkte p\u00e5 build-hosten. Dette er ikke s\u00e5 sikkert som containere, s\u00e5 det er bedst at l\u00e6se <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/runner\/security\/#usage-of-shell-executor\">dokumentationen til sikkerhed<\/a><\/noindex>, s\u00e5 du ikke misser noget.<\/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>Apple-n\u00f8glebindingssystemet skal v\u00e6re konfigureret p\u00e5 denne host med adgang til de n\u00f8gler, som Xcode har brug for til at bygge. Den enkleste m\u00e5de at teste dette p\u00e5 er at logge ind som brugeren, der skal udf\u00f8re bygningen, og fors\u00f8ge at k\u00f8re en manuel bygning. Hvis systemet beder om adgang til n\u00f8glebindingen, skal du v\u00e6lge 'Alltid tillad', s\u00e5 CI fungerer. Det kan v\u00e6re en god id\u00e9 at logge ind og overv\u00e5ge de f\u00f8rste par pipelines for at sikre, at de ikke l\u00e6ngere beder om n\u00f8glebindingen. Problemet er, at Apple ikke g\u00f8r det nemt for os at arbejde i automatisk tilstand, men n\u00e5r du f\u00e5r det opsat, vil alt v\u00e6re i orden.<\/p>\n<p><\/p>\n<h3 id=\"fastlane-init\">fastlane init<\/h3>\n<p><\/p>\n<p>For at bruge fastlane i projektet skal du k\u00f8re <code>fastlane init<\/code>. F\u00f8lg bare <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/getting-started\/ios\/setup\/\">instruktionerne til installation og k\u00f8rsel af fastlane<\/a><\/noindex>, is\u00e6r sektionen om <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/getting-started\/ios\/setup\/#use-a-gemfile\">Gemfile<\/a><\/noindex>, da vi har brug for en hurtig og forudsigelig opstart gennem CI-pipelinen.<\/p>\n<p><\/p>\n<p>I projektmappen skal du k\u00f8re f\u00f8lgende kommandoer:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">xcode-select --install\nsudo gem install fastlane -NV\n# Alternativt ved brug af Homebrew\n# brew cask install fastlane\nfastlane init<\/code><\/pre>\n<p><\/p>\n<p>fastlane vil anmode om en grundl\u00e6ggende konfiguration, og derefter oprette en mappe i projektet med navnet fastlane, som indeholder tre filer:<\/p>\n<p><\/p>\n<p><strong><code>1. fastlane\/Appfile<\/code><\/strong><\/p>\n<p><\/p>\n<p>Der er ikke noget kompliceret ved dette. Tjek blot, at Apple ID og app-ID er angivet korrekt.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">app_identifier(\"com.vontrance.flappybird\") # Bundlet ID for din app\napple_id(\"your-email@your-domain.com\") # Din 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> definerer byggeprocessen. Vi bruger mange indbyggede funktioner i fastlane, s\u00e5 det er ogs\u00e5 klart her. Vi opretter en linje, der skaffer certifikater, udf\u00f8rer bygningen og uploader den til TestFlight. Du kan opdele denne proces i forskellige opgaver, hvis n\u00f8dvendigt. Alle disse operationer (<code>get_certificates<\/code>, <code>get_provisioning_profile<\/code>, <code>gym<\/code> og <code>upload_to_testflight<\/code>) er allerede inkluderet i fastlane.<\/p>\n<p><\/p>\n<p>Handlinger <code>get_certificates<\/code> og <code>get_provisioning_profile<\/code> er relateret til signaturmetoden <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-cert-and-sigh\">cert og sigh.<\/a><\/noindex>. Hvis du bruger <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-match\">match<\/a><\/noindex> eller noget andet, skal du foretage \u00e6ndringer.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">default_platform(:ios)\n\nplatform :ios do\n  desc \"Byg applikationen\"\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>Dette er en valgfri fil, men jeg oprettede den manuelt for at \u00e6ndre standardoutputkataloget og placere outputtet i den aktuelle mappe. Det g\u00f8r CI enklere. Hvis du er interesseret, l\u00e6s om <code>gym<\/code> og dens parametre i <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/actions\/gym\/\">dokumentationen<\/a><\/noindex>.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">https:\/\/docs.fastlane.tools\/actions\/gym\/<\/code><\/pre>\n<p><\/p>\n<p>Vores <strong><code>.gitlab-ci.yml<\/code><\/strong><\/p>\n<p><\/p>\n<p>S\u00e5 vi har en CI-l\u00f8ber til projektet, og vi er klar til at teste pipeline. Lad os se, hvad vi har i <code>.gitlab-ci.yml<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">stages:\n  - build\n\nvariables:\n  LC_ALL: \"en_US.UTF-8\"\n  LANG: \"en_US.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>Det ser godt ud! <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/getting-started\/ios\/setup\/#set-up-environment-variables\">Vi s\u00e6tter UTF-8 formatet for fastlane, som kr\u00e6vet<\/a><\/noindex>, bruger strategien <code>clone<\/code> med eksekveringsprogrammet <code>shell<\/code>, s\u00e5 vi har et rent arbejdsomr\u00e5de til hver bygning, og kalder simpelthen <code>flappybuild<\/code> fastlane, som vist ovenfor. I sidste ende f\u00e5r vi bygning, signatur og deployment af den seneste bygning til TestFlight.<\/p>\n<p><\/p>\n<p>Vi f\u00e5r ogs\u00e5 artefakten og gemmer den sammen med bygningen. Bem\u00e6rk, at formatet <code>.ipa<\/code> \u2014 det er en signeret ARM eksekverbar fil, som ikke kan k\u00f8re i simulatoren. Hvis du vil have output til simulatoren, skal du simpelthen tilf\u00f8je en bygge-target, der producerer den, og s\u00e5 inkludere den i artefaktstien.<\/p>\n<p><\/p>\n<h3 id=\"drugie-peremennye-sredy\">Andre milj\u00f8variabler<\/h3>\n<p><\/p>\n<p>Her er et par milj\u00f8variabler, som alt arbejder p\u00e5.<\/p>\n<p><\/p>\n<p><strong><code>FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD<\/code><\/strong> og <strong><code>FASTLANE_SESSION<\/code><\/strong><\/p>\n<p><\/p>\n<p>For autentificering i App Store og upload til TestFlight kr\u00e6ves autentificering for fastlane. For dette skal du oprette en applikationsspecifik adgangskode, der bruges i CI. Detaljer <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/best-practices\/continuous-integration\/#use-of-application-specific-passwords-and-spaceauth\">her<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Hvis du har to-faktor-autentificering, skal du oprette en variabel <code>FASTLANE_SESSION<\/code> (instruktioner der).<\/p>\n<p><\/p>\n<p><strong><code>FASTLANE_USER<\/code><\/strong> og <strong><code>FASTLANE_PASSWORD<\/code><\/strong><\/p>\n<p><\/p>\n<p>For at <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-cert-and-sigh\">cert og sigh.<\/a><\/noindex> har kaldt initiationsprofilen og certifikaterne efter anmodning; variablerne skal angives <code>FASTLANE_USER<\/code> og <code>FASTLANE_PASSWORD<\/code>. Detaljer <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/best-practices\/continuous-integration\/#environment-variables-to-set\">her<\/a><\/noindex>. Dette er ikke n\u00f8dvendigt, hvis du bruger en anden signaturmetode.<\/p>\n<p><\/p>\n<h3 id=\"v-zaklyuchenie\">Afslutningsvis<\/h3>\n<p><\/p>\n<p>Se hvordan det hele fungerer <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/jlenny\/flappyokr\">i mit enkle eksempel<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Jeg h\u00e5ber, dette var nyttigt, og jeg har inspireret dig til at arbejde med iOS-builds i dit GitLab-projekt. Her er nogle flere <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/best-practices\/continuous-integration\/\">tips til CI<\/a><\/noindex> til fastlane, bare s\u00e5 du ved det. M\u00e5ske \u00f8nsker du at bruge <code>CI_BUILD_ID<\/code> (til inkrementelle builds), for at <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/best-practices\/continuous-integration\/gitlab\/#auto-incremented-build-number\">automatisere versionering<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>En anden fed funktion i fastlane er <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/getting-started\/ios\/screenshots\/\">automatiske screenshots<\/a><\/noindex> til App Store, som er meget nemme at konfigurere.<\/p>\n<p><\/p>\n<p>Fort\u00e6l om dine erfaringer i kommentarerne, og del id\u00e9er til at forbedre GitLab til udvikling af iOS-apps.<\/p>\n<p>Kilde: <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 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041a\u0430\u043a GitLab \u0441 fastlane.\" \/>\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\/da\/blog\/administrirovanie\/publikuem-prilozheniya-ios-v-app-store-s-gitlab-i-fastlane\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/da\/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\udd47Udgiv iOS-apps i App Store med GitLab og fastlane | ProHoster","description":"Hvordan GitLab arbejder med fastlane.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/publikuem-prilozheniya-ios-v-app-store-s-gitlab-i-fastlane","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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.","og:url":"https:\/\/prohoster.info\/da\/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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/42201","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=42201"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/42201\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/42202"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=42201"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=42201"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=42201"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}