{"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\/sv\/blog\/administrirovanie\/publikuem-prilozheniya-ios-v-app-store-s-gitlab-i-fastlane","title":{"rendered":"Vi publicerar iOS-appar i App Store med GitLab och fastlane","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Vi publicerar iOS-appar i App Store med GitLab och fastlane\" src=\"\/wp-content\/uploads\/2019\/03\/a82a2584dfa78743d9e91e399939061f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hur GitLab med fastlane bygger, signerar och publicerar applikationer f\u00f6r iOS i App Store.<\/p>\n<p><\/p>\n<p>Nyligen hade vi en <noindex><a rel=\"nofollow\" href=\"https:\/\/about.gitlab.com\/2019\/01\/28\/android-publishing-with-gitlab-and-fastlane\/\">post om hur man snabbt bygger och lanserar en Android-applikation<\/a><\/noindex> med GitLab och <noindex><a rel=\"nofollow\" href=\"https:\/\/fastlane.tools\/\">fastlane.<\/a><\/noindex>H\u00e4r kommer vi att se hur man bygger och lanserar en iOS-applikation och publicerar den i TestFlight. Kolla in hur h\u00e4ftigt <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=325FyJt7ZG8\">jag g\u00f6r en \u00e4ndring p\u00e5 iPad Pro med GitLab Web IDE<\/a><\/noindex>, tar en byggnad och f\u00e5r en uppdatering av testversionen av applikationen p\u00e5 samma iPad Pro d\u00e4r jag utvecklade den.<\/p>\n<p><\/p>\n<p>H\u00e4r kommer vi att ta en <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/jlenny\/flappyokr\">enkel iOS-applikation p\u00e5 Swift<\/a><\/noindex>, som jag spelade in en video med.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"para-slov-o-konfiguracii-apple-store\">N\u00e5gra ord om Apple Store-konfigurationen<\/h3>\n<p><\/p>\n<p>Vi beh\u00f6ver en app i App Store, distributionscertifikat och en initieringsprofil f\u00f6r att knyta allt samman.<\/p>\n<p><\/p>\n<p>Det sv\u00e5raste h\u00e4r \u00e4r att st\u00e4lla in signeringsr\u00e4ttigheter i App Store. Jag hoppas att ni kan klara av det sj\u00e4lva. Om du \u00e4r nyb\u00f6rjare kommer jag att ge dig den n\u00f6dv\u00e4ndiga riktningen, men h\u00e4r kommer vi inte att prata om detaljerna kring hantering av Apple-certifikat, eftersom de st\u00e4ndigt f\u00f6r\u00e4ndras. Den h\u00e4r posten kommer att hj\u00e4lpa dig att komma ig\u00e5ng.<\/p>\n<p><\/p>\n<h3 id=\"moi-prilozheniya\">Mina applikationer<\/h3>\n<p><\/p>\n<p>Du beh\u00f6ver en applikation i App Store Connect f\u00f6r att ha ett ID f\u00f6r konfigurationen <code>.xcodebuild<\/code>. Profilen och applikations-ID:t kopplar samman kodbyggen, priser och tillg\u00e4nglighet, samt TestFlight-konfigurationen f\u00f6r att distribuera testapplikationer till anv\u00e4ndare. G\u00f6r inget offentligt test, ett privat test r\u00e4cker om du har en liten grupp, enkel konfiguration och inte beh\u00f6ver ytterligare beh\u00f6righeter fr\u00e5n Apple.<\/p>\n<p><\/p>\n<h3 id=\"profil-inicializacii\">Initieringsprofil<\/h3>\n<p><\/p>\n<p>F\u00f6rutom att s\u00e4tta upp applikationen beh\u00f6ver du distributions- och utvecklingsnycklar f\u00f6r iOS, skapade i avsnittet Certifikat, identifierare &amp; profiler (Certificates, Identifiers &amp; Profiles) i Apple Developer-konsolen. Alla dessa certifikat kan sammanfogas i en initieringsprofil.<\/p>\n<p><\/p>\n<p>Anv\u00e4ndare som ska autentiseras beh\u00f6ver m\u00f6jlighet att skapa certifikat, annars kommer du att se ett fel vid <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-cert-and-sigh\">cert och sigh.<\/a><\/noindex> Andra alternativ<\/p>\n<p><\/p>\n<h3 id=\"drugie-varianty\">F\u00f6rutom denna enkla metod finns det andra s\u00e4tt att konfigurera certifikat och profiler. S\u00e5 om du arbetar p\u00e5 ett annat s\u00e4tt kan det h\u00e4nda att du beh\u00f6ver omstrukturera. Det viktigaste \u00e4r att du beh\u00f6ver en konfiguration<\/h3>\n<p><\/p>\n<p>, som pekar p\u00e5 n\u00f6dv\u00e4ndiga filer, och nyckelringen m\u00e5ste vara tillg\u00e4nglig p\u00e5 byggdatorn f\u00f6r anv\u00e4ndaren vars namn som k\u00f6raren arbetar under. F\u00f6r digital signering anv\u00e4nder vi fastlane, och om det finns problem eller om du vill veta mer, titta p\u00e5 deras detaljer. <code>.xcodebuild<\/code>, som kommer att ange de n\u00f6dv\u00e4ndiga filerna, och nyckelkopplingen m\u00e5ste vara tillg\u00e4nglig p\u00e5 byggdatorn f\u00f6r anv\u00e4ndaren vars namn som k\u00f6rs av runner. F\u00f6r digital signatur anv\u00e4nder vi fastlane, och om det finns problem eller om du vill veta mer, l\u00e4s deras detaljerade <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/\">dokumentation om digitala signaturer<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>I det h\u00e4r exemplet anv\u00e4nder jag en strategi <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-cert-and-sigh\">cert och sigh.<\/a><\/noindex>, men f\u00f6r verklig till\u00e4mpning kanske <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\">F\u00f6rberedelse av GitLab och fastlane<\/h2>\n<p><\/p>\n<h3 id=\"podgotovka-ci-runner\">F\u00f6rberedelse av CI Runner<\/h3>\n<p><\/p>\n<p>N\u00e4r vi har samlat all denna information g\u00e5r vi \u00f6ver till att konfigurera GitLab-runnern p\u00e5 en MacOS-enhet. Tyv\u00e4rr kan iOS-appar endast skapas p\u00e5 MacOS. Men allt kan f\u00f6r\u00e4ndras, och om du v\u00e4ntar p\u00e5 framsteg p\u00e5 detta omr\u00e5de, h\u00e5ll dig uppdaterad med projekt som <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/facebook\/xcbuild\">xcbuild<\/a><\/noindex> och <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/saucelabs\/isign\">isign<\/a><\/noindex>, och v\u00e5r interna uppgift <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>Att konfigurera runnern \u00e4r mycket enkelt. F\u00f6lj de aktuella <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/runner\/install\/osx.html\">instruktionerna f\u00f6r att konfigurera GitLab Runner i macOS<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Observera. Runnern m\u00e5ste anv\u00e4nda k\u00f6rs\u00e4ttet <code>shell<\/code>. Detta \u00e4r n\u00f6dv\u00e4ndigt f\u00f6r iOS-bygge i macOS, f\u00f6r att arbeta direkt som anv\u00e4ndare, ist\u00e4llet f\u00f6r genom containrar. Om du anv\u00e4nder <code>shell<\/code>, utf\u00f6rs bygget och testningen under runneranv\u00e4ndarens namn, direkt p\u00e5 byggv\u00e4rden. Detta \u00e4r inte lika s\u00e4kert som containrar, s\u00e5 det \u00e4r b\u00e4st att bl\u00e4ddra igenom <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/runner\/security\/#usage-of-shell-executor\">dokumentationen om s\u00e4kerhet<\/a><\/noindex>, s\u00e5 att du inte missar n\u00e5got.<\/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-kontot m\u00e5ste vara konfigurerat p\u00e5 denna v\u00e4rd med tillg\u00e5ng till de nycklar som kr\u00e4vs av Xcode f\u00f6r bygget. Det enklaste s\u00e4ttet att testa detta \u00e4r att logga in som den anv\u00e4ndare som kommer att k\u00f6ra bygget och f\u00f6rs\u00f6ka genomf\u00f6ra bygget manuellt. Om systemet ber om tillg\u00e5ng till kontot v\u00e4ljer du \"Alltid till\u00e5t\" s\u00e5 att CI fungerar. Det kan vara v\u00e4rt att logga in och observera de f\u00f6rsta paar pipelines, f\u00f6r att se till att de inte l\u00e4ngre beg\u00e4r kontot. Problemet \u00e4r att Apple inte g\u00f6r det enkelt f\u00f6r oss att anv\u00e4nda automatisk metod, men n\u00e4r du v\u00e4l har f\u00e5tt det att fungera, kommer allt att vara bra.<\/p>\n<p><\/p>\n<h3 id=\"fastlane-init\">fastlane init<\/h3>\n<p><\/p>\n<p>F\u00f6r att anv\u00e4nda fastlane i projektet, k\u00f6r <code>fastlane init<\/code>. F\u00f6lj bara <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/getting-started\/ios\/setup\/\">installations- och k\u00f6rinstruktionerna f\u00f6r fastlane<\/a><\/noindex>, s\u00e4rskilt i avsnittet om <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/getting-started\/ios\/setup\/#use-a-gemfile\">Gemfile<\/a><\/noindex>, eftersom vi beh\u00f6ver snabb och f\u00f6ruts\u00e4gbar k\u00f6rning genom den automatiska CI-pipelinen.<\/p>\n<p><\/p>\n<p>I projektkatalogen k\u00f6r dessa kommandon:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">xcode-select --install\nsudo gem install fastlane -NV\n# Alternativt via Homebrew\n# brew cask install fastlane\nfastlane init<\/code><\/pre>\n<p><\/p>\n<p>fastlane kommer att be om grundl\u00e4ggande konfiguration och sedan skapa en mapp i projektet som heter fastlane med tre filer:<\/p>\n<p><\/p>\n<p><strong><code>1. fastlane\/Appfile<\/code><\/strong><\/p>\n<p><\/p>\n<p>H\u00e4r \u00e4r det inget komplicerat. Kontrollera bara att Apple ID och app-ID \u00e4r korrekt angivna.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">app_identifier(\"com.vontrance.flappybird\") # Paketidentifier f\u00f6r din app\napple_id(\"your-email@your-domain.com\") # Din Apple-e-postadress<\/code><\/pre>\n<p><\/p>\n<p><strong><code>2. fastlane\/Fastfile<\/code><\/strong><\/p>\n<p><\/p>\n<p><code>Fastfile<\/code> definierar byggstegen. Vi anv\u00e4nder m\u00e5nga inbyggda funktioner i fastlane, s\u00e5 allt h\u00e4r \u00e4r ocks\u00e5 tydligt. Vi skapar en rad som h\u00e4mtar certifikat, utf\u00f6r bygget och laddar upp det till TestFlight. Du kan dela upp den h\u00e4r processen i olika uppgifter om det beh\u00f6vs. Alla dessa operationer (<code>get_certificates<\/code>, <code>get_provisioning_profile<\/code>, <code>gym<\/code> och <code>upload_to_testflight<\/code>) ing\u00e5r redan i fastlane.<\/p>\n<p><\/p>\n<p>\u00c5tg\u00e4rder <code>get_certificates<\/code> och <code>get_provisioning_profile<\/code> \u00e4r relaterade till signeringsmetoden <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-cert-and-sigh\">cert och sigh.<\/a><\/noindex>. Om du anv\u00e4nder <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-match\">match<\/a><\/noindex> eller n\u00e5got annat, g\u00f6r \u00e4ndringar.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">default_platform(:ios)\n\nplatform :ios do\n  desc \"Bygg 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>Det h\u00e4r \u00e4r en valfri fil, men jag skapade den manuellt f\u00f6r att \u00e4ndra standardutg\u00e5ngskatalogen och placera utdata i den aktuella mappen. Det f\u00f6renklar CI. Om du \u00e4r intresserad, l\u00e4s om <code>gym<\/code> och dess parametrar 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>V\u00e5r <strong><code>.gitlab-ci.yml<\/code><\/strong><\/p>\n<p><\/p>\n<p>S\u00e5 vi har en CI-k\u00f6rning f\u00f6r projektet och vi \u00e4r redo att testa pipelinen. L\u00e5t oss se vad 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>Allt ser bra ut! <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/getting-started\/ios\/setup\/#set-up-environment-variables\">Vi st\u00e4ller in UTF-8 format f\u00f6r fastlane, precis som kr\u00e4vs<\/a><\/noindex>, anv\u00e4nder strategin <code>clone<\/code> med k\u00f6rprogrammet <code>shell<\/code>, s\u00e5 att vi har ett rent arbetsutrymme f\u00f6r varje byggnad, och helt enkelt anropar <code>flappybuild<\/code> fastlane, som syns ovan. Resultatet \u00e4r att vi f\u00e5r bygget, signeringen och distributionen av den senaste bygget till TestFlight.<\/p>\n<p><\/p>\n<p>Vi f\u00e5r \u00e4ven artefakten och sparar den med bygget. Observera att formatet <code>.ipa<\/code> \u00e4r en signerad k\u00f6rbar ARM-fil som inte k\u00f6rs p\u00e5 simulatorn. Om du vill ha utdata f\u00f6r simulatorn, l\u00e4gg bara till en byggm\u00e5l som producerar den och inkludera den i artefaktens s\u00f6kv\u00e4g.<\/p>\n<p><\/p>\n<h3 id=\"drugie-peremennye-sredy\">Andra milj\u00f6variabler<\/h3>\n<p><\/p>\n<p>H\u00e4r finns ett par milj\u00f6variabler som allt fungerar p\u00e5.<\/p>\n<p><\/p>\n<p><strong><code>FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD<\/code><\/strong> och <strong><code>FASTLANE_SESSION<\/code><\/strong><\/p>\n<p><\/p>\n<p>F\u00f6r autentisering i App Store och uppladdning till TestFlight kr\u00e4vs autentisering f\u00f6r fastlane. Skapa ett app-specifikt l\u00f6senord som ska anv\u00e4ndas i CI. Mer information <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/best-practices\/continuous-integration\/#use-of-application-specific-passwords-and-spaceauth\">h\u00e4r<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Om du har tv\u00e5faktorsautentisering, skapa en variabel <code>FASTLANE_SESSION<\/code> (instruktioner d\u00e4r).<\/p>\n<p><\/p>\n<p><strong><code>FASTLANE_USER<\/code><\/strong> och <strong><code>FASTLANE_PASSWORD<\/code><\/strong><\/p>\n<p><\/p>\n<p>F\u00f6r att <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-cert-and-sigh\">cert och sigh.<\/a><\/noindex> har kallat profil och certifikat p\u00e5 beg\u00e4ran, du beh\u00f6ver st\u00e4lla in variabler <code>FASTLANE_USER<\/code> och <code>FASTLANE_PASSWORD<\/code>. Mer information <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/best-practices\/continuous-integration\/#environment-variables-to-set\">h\u00e4r<\/a><\/noindex>. Detta beh\u00f6vs inte om du anv\u00e4nder en annan signeringsmetod.<\/p>\n<p><\/p>\n<h3 id=\"v-zaklyuchenie\">Avslutningsvis<\/h3>\n<p><\/p>\n<p>Se hur allt fungerar <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/jlenny\/flappyokr\">i mitt enkla exempel<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Jag hoppas att detta var anv\u00e4ndbart och att jag har inspirerat dig att arbeta med iOS-byggnader i GitLab-projektet. H\u00e4r \u00e4r n\u00e5gra fler <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/best-practices\/continuous-integration\/\">CI-tips<\/a><\/noindex> f\u00f6r fastlane, ifall du vill anv\u00e4nda <code>CI_BUILD_ID<\/code> (f\u00f6r inkrementella byggen) f\u00f6r att <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/best-practices\/continuous-integration\/gitlab\/#auto-incremented-build-number\">automatiskt inkrementera versionen<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>\u00c4nnu en cool funktion i fastlane \u00e4r <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/getting-started\/ios\/screenshots\/\">automatiska sk\u00e4rmbilder<\/a><\/noindex> f\u00f6r App Store, som \u00e4r v\u00e4ldigt enkelt att konfigurera.<\/p>\n<p><\/p>\n<p>Ber\u00e4tta g\u00e4rna i kommentarerna om din erfarenhet och dela id\u00e9er f\u00f6r att f\u00f6rb\u00e4ttra GitLab f\u00f6r iOS-utveckling.<\/p>\n<p>K\u00e4lla: <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.4 - 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\/sv\/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.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\udd47Publicera iOS-appar i App Store med GitLab och fastlane | ProHoster","description":"Hur GitLab med fastlane.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/publikuem-prilozheniya-ios-v-app-store-s-gitlab-i-fastlane","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/42201","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=42201"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/42201\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/42202"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=42201"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=42201"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=42201"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}