{"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\/it\/blog\/administrirovanie\/publikuem-prilozheniya-ios-v-app-store-s-gitlab-i-fastlane","title":{"rendered":"Pubblicare applicazioni iOS su App Store con GitLab e fastlane","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Pubblicare applicazioni iOS su App Store con GitLab e fastlane\" src=\"\/wp-content\/uploads\/2019\/03\/a82a2584dfa78743d9e91e399939061f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Come GitLab con fastlane compila, firma e pubblica applicazioni per iOS su App Store.<\/p>\n<p><\/p>\n<p>Recentemente abbiamo avuto <noindex><a rel=\"nofollow\" href=\"https:\/\/about.gitlab.com\/2019\/01\/28\/android-publishing-with-gitlab-and-fastlane\/\">un articolo su come compilare e avviare rapidamente un'app Android<\/a><\/noindex> con GitLab e <noindex><a rel=\"nofollow\" href=\"https:\/\/fastlane.tools\/\">fastlane<\/a><\/noindex>. Qui vedremo come compilare e avviare un'app iOS e pubblicarla su TestFlight. Date un'occhiata a quanto \u00e8 fantastico <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=325FyJt7ZG8\">sto apportando una modifica su iPad Pro con GitLab Web IDE<\/a><\/noindex>, prendo la build e ottengo un aggiornamento della versione beta dell'applicazione sullo stesso iPad Pro dove l'ho sviluppata.<\/p>\n<p><\/p>\n<p>Qui prenderemo <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/jlenny\/flappyokr\">una semplice applicazione per iOS in Swift<\/a><\/noindex>, con cui ho registrato un video.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"para-slov-o-konfiguracii-apple-store\">Due parole sulla configurazione dell'Apple Store<\/h3>\n<p><\/p>\n<p>Avremo bisogno di un'app su App Store, certificati di distribuzione e un profilo di provisioning per mettere tutto insieme.<\/p>\n<p><\/p>\n<p>La cosa pi\u00f9 difficile \u00e8 configurare i diritti di firma su App Store. Spero che possiate farlo da soli. Se siete principianti, vi dar\u00f2 le giuste indicazioni, ma qui non parleremo delle complessit\u00e0 della gestione dei certificati Apple, che peraltro cambiano costantemente. Questo post vi aiuter\u00e0 a iniziare.<\/p>\n<p><\/p>\n<h3 id=\"moi-prilozheniya\">Le mie applicazioni<\/h3>\n<p><\/p>\n<p>\u00c8 necessario un'app su App Store Connect per avere un ID per la configurazione <code>.xcodebuild<\/code>. Il profilo e l'ID dell'app collegano le build del codice, i prezzi e la disponibilit\u00e0, oltre alla configurazione di TestFlight per la distribuzione di applicazioni in fase di beta testing agli utenti. Non effettuate test pubblici, va bene anche il privato, se avete un piccolo gruppo, una configurazione semplice e non richiedete autorizzazioni aggiuntive da Apple.<\/p>\n<p><\/p>\n<h3 id=\"profil-inicializacii\">Profilo di provisioning<\/h3>\n<p><\/p>\n<p>Oltre alla configurazione dell'app, avrete bisogno di chiavi di distribuzione e sviluppo iOS, create nella sezione Certificates, Identifiers &amp; Profiles (Certificati, identificatori e profili) nella console Apple Developer. Tutti questi certificati possono essere combinati in un profilo di provisioning.<\/p>\n<p><\/p>\n<p>Agli utenti che si autenticheranno \u00e8 necessaria la possibilit\u00e0 di creare certificati, altrimenti durante le fasi <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-cert-and-sigh\">cert e sigh<\/a><\/noindex> vedrete un errore.<\/p>\n<p><\/p>\n<h3 id=\"drugie-varianty\">Altre opzioni<\/h3>\n<p><\/p>\n<p>Oltre a questo semplice metodo, ci sono altri modi per configurare certificati e profili. Quindi, se lavorate in modo differente, potreste dover ristrutturare. La cosa pi\u00f9 importante \u00e8 che avrete bisogno di una configurazione. <code>.xcodebuild<\/code>, che indicher\u00e0 i file necessari, e le chiavi devono essere accessibili sul computer di compilazione per l'utente sotto il cui nome opera il runner. Per la firma digitale utilizziamo fastlane, e se ci sono problemi o se desideri saperne di pi\u00f9, consulta la loro dettagliata <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/\">documentazione sulla firma digitale<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>In questo esempio utilizzo un approccio <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-cert-and-sigh\">cert e sigh<\/a><\/noindex>, ma per un'applicazione reale, probabilmente \u00e8 meglio utilizzare <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\">Preparazione di GitLab e fastlane<\/h2>\n<p><\/p>\n<h3 id=\"podgotovka-ci-runner\">Preparazione del CI Runner<\/h3>\n<p><\/p>\n<p>Raccolti tutti questi dati, passiamo alla configurazione del runner di GitLab sul dispositivo MacOS. Sfortunatamente, \u00e8 possibile creare applicazioni iOS solo su MacOS. Ma le cose potrebbero cambiare, e se aspetti dei progressi in questo campo, segui i progetti come <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/facebook\/xcbuild\">xcbuild<\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/saucelabs\/isign\">isign<\/a><\/noindex>, e il nostro task interno <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>Configurare il runner \u00e8 molto semplice. Segui le attuali <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/runner\/install\/osx.html\">istruzioni per la configurazione del GitLab Runner su macOS<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Nota. Il runner deve utilizzare il programma eseguibile <code>shell<\/code>. Questo \u00e8 obbligatorio per compilare iOS su macOS, per lavorare direttamente come utente, e non tramite contenitori. Se utilizzi <code>shell<\/code>, la compilazione e il test vengono eseguiti sotto il nome utente del runner, direttamente sull'host di compilazione. Questo non \u00e8 sicuro come i contenitori, quindi \u00e8 meglio dare un'occhiata alla <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/runner\/security\/#usage-of-shell-executor\">documentazione sulla sicurezza<\/a><\/noindex>, per non perdere nulla.<\/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>Il portachiavi di Apple deve essere configurato su questo host con accesso alle chiavi necessarie a Xcode per la compilazione. Il modo pi\u00f9 semplice per testarlo \u00e8 accedere come utente che eseguir\u00e0 la compilazione e provare a eseguire manualmente la compilazione. Se il sistema richiede l'accesso al portachiavi, scegli \"Consenti sempre\" affinch\u00e9 il CI funzioni. Potrebbe essere utile accedere e osservare i primi due pipeline, per assicurarsi che non richiedano pi\u00f9 il portachiavi. Il problema \u00e8 che Apple non semplifica il nostro lavoro in modalit\u00e0 automatica, ma una volta che la configuri, andr\u00e0 tutto bene.<\/p>\n<p><\/p>\n<h3 id=\"fastlane-init\">fastlane init<\/h3>\n<p><\/p>\n<p>Per utilizzare fastlane nel progetto, esegui <code>fastlane init<\/code>. Segui semplicemente <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/getting-started\/ios\/setup\/\">le istruzioni per l'installazione e l'avvio di fastlane<\/a><\/noindex>, soprattutto nella sezione dedicata a <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/getting-started\/ios\/setup\/#use-a-gemfile\">Gemfile<\/a><\/noindex>, perch\u00e9 abbiamo bisogno di un avvio rapido e prevedibile attraverso il pipeline CI automatizzato.<\/p>\n<p><\/p>\n<p>Nella directory del progetto esegui questi comandi:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">xcode-select --install\nsudo gem install fastlane -NV\n# In alternativa, usa Homebrew\n# brew cask install fastlane\nfastlane init<\/code><\/pre>\n<p><\/p>\n<p>fastlane richieder\u00e0 una configurazione di base e poi creer\u00e0 nella cartella del progetto una cartella fastlane con tre file:<\/p>\n<p><\/p>\n<p><strong><code>1. fastlane\/Appfile<\/code><\/strong><\/p>\n<p><\/p>\n<p>Qui non c'\u00e8 nulla di complicato. Controlla semplicemente che l'Apple ID e l'ID dell'app siano indicati correttamente.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">app_identifier(\"com.vontrance.flappybird\") # L'identificatore del bundle della tua app\napple_id(\"your-email@your-domain.com\") # Il tuo indirizzo 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> definisce i passaggi di costruzione. Utilizziamo molte funzionalit\u00e0 integrate di fastlane, quindi anche qui \u00e8 tutto chiaro. Creiamo una singola linea che riceve i certificati, esegue la costruzione e la carica in TestFlight. Puoi suddividere questo processo in pi\u00f9 compiti, se necessario. Tutte queste operazioni (<code>get_certificates<\/code>, <code>get_provisioning_profile<\/code>, <code>gym<\/code> e <code>upload_to_testflight<\/code>) sono gi\u00e0 incluse in fastlane.<\/p>\n<p><\/p>\n<p>Azioni <code>get_certificates<\/code> e <code>get_provisioning_profile<\/code> sono correlate all'approccio di firma <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-cert-and-sigh\">cert e sigh<\/a><\/noindex>. Se utilizzi <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-match\">match<\/a><\/noindex> o qualsiasi altra cosa, apporta le modifiche necessarie.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">default_platform(:ios)\n\nplatform :ios do\n  desc \"Costruisci l'applicazione\"\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>Questo \u00e8 un file facoltativo, ma l'ho creato manualmente per cambiare la cartella di output predefinita e posizionare i risultati nella cartella corrente. Questo semplifica il CI. Se sei interessato, leggi su <code>gym<\/code> e le sue opzioni in <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/actions\/gym\/\">documentazione<\/a><\/noindex>.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">https:\/\/docs.fastlane.tools\/actions\/gym\/<\/code><\/pre>\n<p><\/p>\n<p>Il nostro <strong><code>.gitlab-ci.yml<\/code><\/strong><\/p>\n<p><\/p>\n<p>Quindi, abbiamo un runner CI per il progetto e siamo pronti a testare la pipeline. Diamo un'occhiata a cosa abbiamo in <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>Tutto perfetto! <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/getting-started\/ios\/setup\/#set-up-environment-variables\">Impostiamo il formato UTF-8 per fastlane, come richiesto<\/a><\/noindex>, utilizziamo la strategia <code>clone<\/code> con il programma eseguibile <code>shell<\/code>, in modo che abbiamo uno spazio di lavoro pulito per ogni build, e semplicemente chiamiamo <code>flappybuild<\/code> fastlane, come si \u00e8 visto sopra. Alla fine otteniamo la compilazione, la firma e il deploy dell'ultima build in TestFlight.<\/p>\n<p><\/p>\n<p>Otteniamo anche l'artefatto e lo salviamo con la build. Nota che il formato <code>.ipa<\/code> \u00e8 un file eseguibile ARM firmato che non pu\u00f2 essere eseguito sul simulatore. Se desideri i risultati per il simulatore, basta aggiungere un target di build che lo produca e poi includerlo nel percorso dell'artefatto.<\/p>\n<p><\/p>\n<h3 id=\"drugie-peremennye-sredy\">Altre variabili ambientali<\/h3>\n<p><\/p>\n<p>Ci sono un paio di variabili ambientali su cui tutto funziona.<\/p>\n<p><\/p>\n<p><strong><code>FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD<\/code><\/strong> e <strong><code>FASTLANE_SESSION<\/code><\/strong><\/p>\n<p><\/p>\n<p>Per l'autenticazione nell'App Store e il caricamento in TestFlight \u00e8 necessaria l'autenticazione per fastlane. A tal fine, crea una password per applicazione che verr\u00e0 utilizzata nel CI. Maggiori dettagli <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/best-practices\/continuous-integration\/#use-of-application-specific-passwords-and-spaceauth\">qui<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Se hai l'autenticazione a due fattori, crea una variabile <code>FASTLANE_SESSION<\/code> (le istruzioni sono l\u00ec).<\/p>\n<p><\/p>\n<p><strong><code>FASTLANE_USER<\/code><\/strong> e <strong><code>FASTLANE_PASSWORD<\/code><\/strong><\/p>\n<p><\/p>\n<p>Per <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-cert-and-sigh\">cert e sigh<\/a><\/noindex> richiamare il profilo di inizializzazione e i certificati su richiesta, \u00e8 necessario impostare le variabili <code>FASTLANE_USER<\/code> e <code>FASTLANE_PASSWORD<\/code>. Maggiori dettagli <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/best-practices\/continuous-integration\/#environment-variables-to-set\">qui<\/a><\/noindex>. Non \u00e8 necessario se usi un altro metodo di firma.<\/p>\n<p><\/p>\n<h3 id=\"v-zaklyuchenie\">In conclusione<\/h3>\n<p><\/p>\n<p>Puoi vedere come funziona tutto questo <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/jlenny\/flappyokr\">nel mio semplice esempio<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Spero che sia stato utile e ti abbia ispirato a lavorare con le build di iOS nel progetto GitLab. Ecco alcuni <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/best-practices\/continuous-integration\/\">consigli su CI<\/a><\/noindex> per fastlane, nel caso tu voglia usarli <code>CI_BUILD_ID<\/code> (per build incrementali), in modo da <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/best-practices\/continuous-integration\/gitlab\/#auto-incremented-build-number\">incrementare automaticamente la versione<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Un'altra fantastica funzionalit\u00e0 di fastlane \u00e8 <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/getting-started\/ios\/screenshots\/\">gli screenshot automatici<\/a><\/noindex> per l'App Store, che sono molto facili da configurare.<\/p>\n<p><\/p>\n<p>Racconta nei commenti la tua esperienza e condividi idee per migliorare GitLab per lo sviluppo di applicazioni iOS.<\/p>\n<p>Fonte: <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.1.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\/it\/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.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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\/it\/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\udd47 Pubblicare applicazioni iOS su App Store con GitLab e fastlane | ProHoster","description":"Come GitLab con fastlane.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/publikuem-prilozheniya-ios-v-app-store-s-gitlab-i-fastlane","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/42201","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=42201"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/42201\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/42202"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=42201"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=42201"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=42201"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}