{"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\/ro\/blog\/administrirovanie\/publikuem-prilozheniya-ios-v-app-store-s-gitlab-i-fastlane","title":{"rendered":"Public\u0103m aplica\u021bii iOS \u00een App Store cu GitLab \u0219i fastlane","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Public\u0103m aplica\u021bii iOS \u00een App Store cu GitLab \u0219i fastlane\" src=\"\/wp-content\/uploads\/2019\/03\/a82a2584dfa78743d9e91e399939061f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cum GitLab folose\u0219te fastlane pentru a compila, semna \u0219i publica aplica\u021bii iOS \u00een App Store.<\/p>\n<p><\/p>\n<p>Recent am avut <noindex><a rel=\"nofollow\" href=\"https:\/\/about.gitlab.com\/2019\/01\/28\/android-publishing-with-gitlab-and-fastlane\/\">o postare despre cum s\u0103 construie\u0219ti \u0219i s\u0103 lansezi rapid o aplica\u021bie Android<\/a><\/noindex> cu GitLab \u0219i <noindex><a rel=\"nofollow\" href=\"https:\/\/fastlane.tools\/\">fastlane<\/a><\/noindex>. Aici vom vedea cum s\u0103 compil\u0103m \u0219i s\u0103 lans\u0103m o aplica\u021bie iOS \u0219i s\u0103 o public\u0103m \u00een TestFlight. Uit\u0103-te c\u00e2t de grozav <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=325FyJt7ZG8\">fac o modificare pe iPad Pro cu GitLab Web IDE<\/a><\/noindex>, iau construc\u021bia \u0219i primesc actualizarea versiunii beta a aplica\u021biei pe acela\u0219i iPad Pro unde am dezvoltat-o.<\/p>\n<p><\/p>\n<p>Aici vom lua <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/jlenny\/flappyokr\">o aplica\u021bie simpl\u0103 pentru iOS scris\u0103 \u00een Swift<\/a><\/noindex>, cu care am realizat un videoclip.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"para-slov-o-konfiguracii-apple-store\">C\u00e2teva cuvinte despre configura\u021bia Apple Store<\/h3>\n<p><\/p>\n<p>Vom avea nevoie de o aplica\u021bie \u00een App Store, certificate de distribu\u021bie \u0219i un profil de ini\u021bializare pentru a lega totul \u00eempreun\u0103.<\/p>\n<p><\/p>\n<p>Cel mai complicat aici este s\u0103 configurezi permisiunile de semnare \u00een App Store. Sper c\u0103 te vei descurca cu asta pe cont propriu. Dac\u0103 e\u0219ti \u00eencep\u0103tor, \u00ee\u021bi voi indica direc\u021bia necesar\u0103, dar aici nu vom discuta despre subtilit\u0103\u021bile gestion\u0103rii certificatelor Apple, mai ales c\u0103 acestea se schimb\u0103 constant. Aceast\u0103 postare te va ajuta s\u0103 \u00eencepi.<\/p>\n<p><\/p>\n<h3 id=\"moi-prilozheniya\">Aplica\u021biile mele<\/h3>\n<p><\/p>\n<p>Ai nevoie de o aplica\u021bie \u00een App Store Connect pentru a avea un ID pentru configura\u021bie <code>.xcodebuild<\/code>. Profilul \u0219i ID-ul aplica\u021biei leag\u0103 construc\u021biile de cod, pre\u021burile \u0219i disponibilitatea, precum \u0219i configura\u021bia TestFlight pentru distribuirea aplica\u021biilor beta utilizatorilor. Nu face teste publice, este suficient un test privat dac\u0103 ai un grup mic, o configura\u021bie simpl\u0103 \u0219i nu ai nevoie de permisiuni suplimentare de la Apple.<\/p>\n<p><\/p>\n<h3 id=\"profil-inicializacii\">Profilul de ini\u021bializare<\/h3>\n<p><\/p>\n<p>\u00cen afar\u0103 de setarea aplica\u021biei, ai nevoie de chei de distribu\u021bie \u0219i dezvoltare iOS, create \u00een sec\u021biunea Certificates, Identifiers &amp; Profiles (Certificat, Identificatori \u0219i Profiluri) din consola Apple Developer. Toate aceste certificate pot fi combinate \u00eentr-un profil de ini\u021bializare.<\/p>\n<p><\/p>\n<p>Utilizatorii care vor trece prin autentificare trebuie s\u0103 aib\u0103 capacitatea de a crea certificate, altfel \u00een etapele <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-cert-and-sigh\">cert \u0219i sigh<\/a><\/noindex> ve\u021bi vedea o eroare.<\/p>\n<p><\/p>\n<h3 id=\"drugie-varianty\">Alte op\u021biuni<\/h3>\n<p><\/p>\n<p>Pe l\u00e2ng\u0103 aceast\u0103 metod\u0103 simpl\u0103, exist\u0103 \u0219i alte modalit\u0103\u021bi de a configura certificatele \u0219i profilurile. A\u0219adar, dac\u0103 lucrezi diferit, s-ar putea s\u0103 fie necesar s\u0103 te reprogramezi. Cel mai important - vei avea nevoie de o configura\u021bie <code>.xcodebuild<\/code>, care s\u0103 fac\u0103 referire la fi\u0219ierele necesare, iar cheia de leg\u0103tur\u0103 trebuie s\u0103 fie disponibil\u0103 pe computerul de construire pentru utilizatorul sub numele c\u0103ruia ruleaz\u0103 runner. Pentru semn\u0103tura digital\u0103 folosim fastlane, iar dac\u0103 exist\u0103 probleme sau vrei s\u0103 afli mai multe, studiaz\u0103 documenta\u021bia lor detaliat\u0103. <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/\">documenta\u021bia despre semn\u0103turile digitale<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>\u00cen acest exemplu, folosesc o abordare <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-cert-and-sigh\">cert \u0219i sigh<\/a><\/noindex>, dar pentru aplicarea real\u0103, probabil c\u0103 este mai bine s\u0103 foloseasc\u0103 <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\">Preg\u0103tirea GitLab \u0219i fastlane<\/h2>\n<p><\/p>\n<h3 id=\"podgotovka-ci-runner\">Preg\u0103tirea CI Runner<\/h3>\n<p><\/p>\n<p>Dup\u0103 ce am adunat toate aceste date, trecem la configurarea GitLab Runner pe dispozitivul MacOS. Din p\u0103cate, aplicarea iOS poate fi realizat\u0103 realmente doar \u00een MacOS. Dar totul se poate schimba, iar dac\u0103 a\u0219tepta\u021bi progrese \u00een acest domeniu, - urm\u0103ri\u021bi proiectele, cum ar fi <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/facebook\/xcbuild\">xcbuild<\/a><\/noindex> \u0219i <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/saucelabs\/isign\">isign<\/a><\/noindex>, \u0219i sarcina noastr\u0103 intern\u0103 <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>Configura\u021bia runner-ului este foarte simpl\u0103. Urma\u021bi <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/runner\/install\/osx.html\">instruc\u021biunile actuale pentru configurarea GitLab Runner \u00een macOS<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Not\u0103. Runner-ul trebuie s\u0103 utilizeze programul executabil <code>shell<\/code>. Acest lucru este obligatoriu pentru a construi iOS \u00een macOS, pentru a func\u021biona direct ca utilizator, nu prin containere. Dac\u0103 utiliza\u021bi <code>shell<\/code>, compilarea \u0219i testarea se efectueaz\u0103 \u00een numele utilizatorului runner-ului, direct pe gazda de compilare. Aceasta nu este la fel de sigur\u0103 ca containerele, a\u0219a c\u0103 ar fi mai bine s\u0103 consulta\u021bi <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/runner\/security\/#usage-of-shell-executor\">documenta\u021bia de securitate<\/a><\/noindex>, pentru a nu pierde nimic.<\/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>Keychain-ul Apple trebuie s\u0103 fie configurat pe aceast\u0103 gazd\u0103, cu acces la cheile de care are nevoie Xcode pentru a construi. Cea mai simpl\u0103 metod\u0103 de testare este s\u0103 te conectezi ca utilizator care va ini\u021bia compilarea \u0219i s\u0103 \u00eencerci s\u0103 efectuezi compilarea manual. Dac\u0103 sistemul solicit\u0103 acces la keychain, alege \u201e\u00centotdeauna permite\u021bi\u201d pentru ca CI s\u0103 func\u021bioneze. Poate ar fi bine s\u0103 te conectezi \u0219i s\u0103 observi primele c\u00e2teva pipeline-uri, - asigur\u00e2ndu-te c\u0103 nu mai cer keychain. Problema este c\u0103 Apple nu ne simplific\u0103 munca \u00een mod automat, dar odat\u0103 ce o configurezi, totul va fi \u00een regul\u0103.<\/p>\n<p><\/p>\n<h3 id=\"fastlane-init\">fastlane init<\/h3>\n<p><\/p>\n<p>Pentru a utiliza fastlane \u00een proiect, ruleaz\u0103 <code>fastlane init<\/code>. Doar urmeaz\u0103 <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/getting-started\/ios\/setup\/\">instruc\u021biunile de instalare \u0219i utilizare fastlane<\/a><\/noindex>, \u00een special \u00een sec\u021biunea despre <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/getting-started\/ios\/setup\/#use-a-gemfile\">Gemfile<\/a><\/noindex>, deoarece avem nevoie de o lansare rapid\u0103 \u0219i previzibil\u0103 printr-un pipeline CI automatizat.<\/p>\n<p><\/p>\n<p>\u00cen directorul proiectului, ruleaz\u0103 aceste comenzi:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">xcode-select --install\nsudo gem install fastlane -NV\n# Alternativ folosind Homebrew\n# brew cask install fastlane\nfastlane init<\/code><\/pre>\n<p><\/p>\n<p>fastlane va solicita o configurare de baz\u0103 \u0219i apoi va crea \u00een proiect un folder fastlane cu trei fi\u0219iere:<\/p>\n<p><\/p>\n<p><strong><code>1. fastlane\/Appfile<\/code><\/strong><\/p>\n<p><\/p>\n<p>Aici nu este nimic complicat. Verific\u0103 doar c\u0103 Apple ID \u0219i ID-ul aplica\u021biei sunt specificate corect.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">app_identifier(\"com.vontrance.flappybird\") # Identificatorul pachetului aplica\u021biei tale\napple_id(\"your-email@your-domain.com\") # Adresa ta de email Apple<\/code><\/pre>\n<p><\/p>\n<p><strong><code>2. fastlane\/Fastfile<\/code><\/strong><\/p>\n<p><\/p>\n<p><code>Fastfile<\/code> define\u0219te pa\u0219ii de construc\u021bie. Folosim multe func\u021bionalit\u0103\u021bi \u00eencorporate \u00een fastlane, a\u0219a c\u0103 totul este clar aici. Cre\u0103m o linie care ob\u021bine certificatele, realizeaz\u0103 construc\u021bia \u0219i o \u00eencarc\u0103 \u00een TestFlight. Po\u021bi s\u0103 \u00eemp\u0103r\u021bi acest proces \u00een sarcini diferite, dac\u0103 este necesar. Toate aceste opera\u021biuni (<code>get_certificates<\/code>, <code>get_provisioning_profile<\/code>, <code>gym<\/code> \u0219i <code>upload_to_testflight<\/code>) sunt deja incluse \u00een fastlane.<\/p>\n<p><\/p>\n<p>Ac\u021biuni <code>get_certificates<\/code> \u0219i <code>get_provisioning_profile<\/code> sunt legate de abordarea semn\u0103rii <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-cert-and-sigh\">cert \u0219i sigh<\/a><\/noindex>. Dac\u0103 folose\u0219ti <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-match\">match<\/a><\/noindex> sau altceva, f\u0103 modific\u0103rile necesare.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">default_platform(:ios)\n\nplatform :ios do\n  desc \"Construie\u0219te aplica\u021bia\"\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>Acesta este un fi\u0219ier op\u021bional, dar l-am creat manual pentru a modifica directorul de ie\u0219ire implicit \u0219i a plasa ie\u0219irile \u00een folderul curent. Acest lucru simplific\u0103 CI. Dac\u0103 e\u0219ti interesat, cite\u0219te despre <code>gym<\/code> \u0219i parametrii s\u0103i \u00een <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/actions\/gym\/\">documentation<\/a><\/noindex>.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">https:\/\/docs.fastlane.tools\/actions\/gym\/<\/code><\/pre>\n<p><\/p>\n<p>Al nostru <strong><code>.gitlab-ci.yml<\/code><\/strong><\/p>\n<p><\/p>\n<p>Deci, avem un CI-runner pentru proiect \u0219i suntem gata s\u0103 test\u0103m pipeline-ul. S\u0103 vedem ce avem \u00een <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>Totul este excelent! <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/getting-started\/ios\/setup\/#set-up-environment-variables\">Stabilim formatul UTF-8 pentru fastlane, a\u0219a cum se cere<\/a><\/noindex>, folosim strategia <code>clone<\/code> cu programul de executare <code>shell<\/code>, pentru a avea un spa\u021biu de lucru curat pentru fiecare construc\u021bie \u0219i pur \u0219i simplu invoc\u0103m <code>flappybuild<\/code> fastlane, a\u0219a cum se vede mai sus. La final, ob\u021binem construc\u021bia, semn\u0103tura \u0219i desf\u0103\u0219urarea ultimei construc\u021bii \u00een TestFlight.<\/p>\n<p><\/p>\n<p>De asemenea, ob\u021binem artefactul \u0219i \u00eel p\u0103str\u0103m \u00eempreun\u0103 cu construc\u021bia. Observ\u0103 c\u0103 formatul <code>.ipa<\/code> \u2014 este un fi\u0219ier executabil ARM semnat, care nu poate fi rulat pe simulator. Dac\u0103 vrei ie\u0219irile pentru simulator, adaug\u0103 pur \u0219i simplu \u021binta de construc\u021bie care o produce, apoi include-o \u00een calea artefactului.<\/p>\n<p><\/p>\n<h3 id=\"drugie-peremennye-sredy\">Alte variabile de mediu<\/h3>\n<p><\/p>\n<p>Aici sunt c\u00e2teva variabile de mediu pe care se bazeaz\u0103 totul.<\/p>\n<p><\/p>\n<p><strong><code>FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD<\/code><\/strong> \u0219i <strong><code>FASTLANE_SESSION<\/code><\/strong><\/p>\n<p><\/p>\n<p>Pentru autentificarea \u00een App Store \u0219i \u00eenc\u0103rcarea \u00een TestFlight, este necesar\u0103 autentificarea pentru fastlane. Pentru aceasta, creeaz\u0103 o parol\u0103 specific\u0103 aplica\u021biei care va fi folosit\u0103 \u00een CI. Detalii <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/best-practices\/continuous-integration\/#use-of-application-specific-passwords-and-spaceauth\">aici<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Dac\u0103 ai autentificare cu doi factori, creeaz\u0103 o variabil\u0103 <code>FASTLANE_SESSION<\/code> (instruc\u021biunile sunt acolo).<\/p>\n<p><\/p>\n<p><strong><code>FASTLANE_USER<\/code><\/strong> \u0219i <strong><code>FASTLANE_PASSWORD<\/code><\/strong><\/p>\n<p><\/p>\n<p>Pentru a <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-cert-and-sigh\">cert \u0219i sigh<\/a><\/noindex> am invocat profilul de ini\u021bializare \u0219i certificatele la cerere, trebuie s\u0103 define\u0219ti variabile <code>FASTLANE_USER<\/code> \u0219i <code>FASTLANE_PASSWORD<\/code>. Detalii <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/best-practices\/continuous-integration\/#environment-variables-to-set\">aici<\/a><\/noindex>. Aceasta nu este necesar\u0103 dac\u0103 folose\u0219ti o alt\u0103 metod\u0103 de semnare.<\/p>\n<p><\/p>\n<h3 id=\"v-zaklyuchenie\">\u00cen concluzie<\/h3>\n<p><\/p>\n<p>Vezi cum func\u021bioneaz\u0103 totul <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/jlenny\/flappyokr\">\u00een exemplul meu simplu<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Sper c\u0103 a fost util \u0219i c\u0103 te-am inspirat s\u0103 lucrezi cu build-urile iOS \u00een proiectul GitLab. Iat\u0103 c\u00e2teva <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/best-practices\/continuous-integration\/\">sfaturi pentru CI<\/a><\/noindex> pentru fastlane, \u00een caz c\u0103 vrei s\u0103 folose\u0219ti <code>CI_BUILD_ID<\/code> (pentru build-uri incrementale), pentru a <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/best-practices\/continuous-integration\/gitlab\/#auto-incremented-build-number\">incrementa automat versiunea<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>O alt\u0103 caracteristic\u0103 interesant\u0103 a fastlane este <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/getting-started\/ios\/screenshots\/\">capturile de ecran automate<\/a><\/noindex> pentru App Store, care sunt foarte u\u0219or de configurat.<\/p>\n<p><\/p>\n<p>Spune-ne \u00een comentarii despre experien\u021ba ta \u0219i \u00eemp\u0103rt\u0103\u0219e\u0219te idei pentru \u00eembun\u0103t\u0103\u021birea GitLab pentru dezvoltarea aplica\u021biilor iOS.<\/p>\n<p>Sursa: <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.2.1 - 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\/ro\/blog\/administrirovanie\/publikuem-prilozheniya-ios-v-app-store-s-gitlab-i-fastlane\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Public\u0103m aplica\u021bii iOS \u00een App Store cu GitLab \u0219i fastlane | ProHoster","description":"Cum se folosesc GitLab cu fastlane.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/publikuem-prilozheniya-ios-v-app-store-s-gitlab-i-fastlane","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/42201","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=42201"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/42201\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/42202"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=42201"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=42201"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=42201"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}