{"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\/es\/blog\/administrirovanie\/publikuem-prilozheniya-ios-v-app-store-s-gitlab-i-fastlane","title":{"rendered":"Publicamos aplicaciones de iOS en la App Store con GitLab y fastlane","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Publicamos aplicaciones de iOS en la App Store con GitLab y fastlane\" src=\"\/wp-content\/uploads\/2019\/03\/a82a2584dfa78743d9e91e399939061f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>C\u00f3mo GitLab con fastlane compila, firma y publica aplicaciones para iOS en el App Store.<\/p>\n<p><\/p>\n<p>Recientemente tuvimos <noindex><a rel=\"nofollow\" href=\"https:\/\/about.gitlab.com\/2019\/01\/28\/android-publishing-with-gitlab-and-fastlane\/\">una publicaci\u00f3n sobre c\u00f3mo compilar y lanzar r\u00e1pidamente una aplicaci\u00f3n de Android<\/a><\/noindex> con GitLab y <noindex><a rel=\"nofollow\" href=\"https:\/\/fastlane.tools\/\">fastlane<\/a><\/noindex>. Aqu\u00ed veremos c\u00f3mo compilar y lanzar una aplicaci\u00f3n de iOS y publicarla en TestFlight. Echa un vistazo a lo genial que es <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=325FyJt7ZG8\">hacer un cambio en un iPad Pro con GitLab Web IDE<\/a><\/noindex>, tomar la compilaci\u00f3n y obtener la actualizaci\u00f3n de la versi\u00f3n de prueba de la aplicaci\u00f3n en el mismo iPad Pro donde la desarroll\u00e9.<\/p>\n<p><\/p>\n<p>Aqu\u00ed utilizaremos <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/jlenny\/flappyokr\">una aplicaci\u00f3n sencilla para iOS en Swift<\/a><\/noindex>, con la que grab\u00e9 el video.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"para-slov-o-konfiguracii-apple-store\">Algunas palabras sobre la configuraci\u00f3n de Apple Store<\/h3>\n<p><\/p>\n<p>Necesitaremos una aplicaci\u00f3n en App Store, certificados de distribuci\u00f3n y un perfil de aprovisionamiento para unir todo.<\/p>\n<p><\/p>\n<p>Lo m\u00e1s complicado aqu\u00ed es configurar los permisos de firma en el App Store. Espero que puedan manejar esto por s\u00ed mismos. Si son nuevos, les indicar\u00e9 la direcci\u00f3n correcta, pero aqu\u00ed no hablaremos de los detalles de la gesti\u00f3n de certificados de Apple, adem\u00e1s, estos cambian constantemente. Esta publicaci\u00f3n les ayudar\u00e1 a empezar.<\/p>\n<p><\/p>\n<h3 id=\"moi-prilozheniya\">Mis aplicaciones<\/h3>\n<p><\/p>\n<p>Necesitan una aplicaci\u00f3n en App Store Connect para tener un ID para la configuraci\u00f3n <code>.xcodebuild<\/code>. El perfil y el ID de la aplicaci\u00f3n combinan las compilaciones de c\u00f3digo, precios y disponibilidad, as\u00ed como la configuraci\u00f3n de TestFlight para distribuir aplicaciones de prueba entre los usuarios. No hagan pruebas p\u00fablicas, es suficiente con la privada si tienen un grupo peque\u00f1o, una configuraci\u00f3n sencilla y no necesitan permisos adicionales de Apple.<\/p>\n<p><\/p>\n<h3 id=\"profil-inicializacii\">El perfil de aprovisionamiento<\/h3>\n<p><\/p>\n<p>Adem\u00e1s de configurar la aplicaci\u00f3n, necesitan claves de distribuci\u00f3n y desarrollo de iOS, creadas en la secci\u00f3n Certificados, Identificadores y Perfiles en la consola de Apple Developer. Todos estos certificados se pueden combinar en un perfil de aprovisionamiento.<\/p>\n<p><\/p>\n<p>Los usuarios que pasar\u00e1n por la autenticaci\u00f3n necesitan la capacidad de crear certificados, de lo contrario, en las etapas <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-cert-and-sigh\">cert y sigh<\/a><\/noindex> ver\u00e1n un error.<\/p>\n<p><\/p>\n<h3 id=\"drugie-varianty\">Otras opciones<\/h3>\n<p><\/p>\n<p>Adem\u00e1s de este m\u00e9todo sencillo, hay otras formas de configurar certificados y perfiles. As\u00ed que, si trabajan de manera diferente, tal vez tengan que reconfigurarse. Lo m\u00e1s importante es que necesitar\u00e1n una configuraci\u00f3n <code>.xcodebuild<\/code>, que apunte a los archivos necesarios, y la llavero debe estar disponible en la computadora de compilaci\u00f3n para el usuario bajo cuyo nombre opera el runner. Para la firma digital utilizamos fastlane, y si hay problemas o quieren saber m\u00e1s, revisen su documentaci\u00f3n detallada. <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/\">documentaci\u00f3n sobre firmas digitales<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>En este ejemplo, utilizo un enfoque <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-cert-and-sigh\">cert y sigh<\/a><\/noindex>, pero para aplicaciones reales, probablemente sea mejor <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\">Preparaci\u00f3n de GitLab y fastlane<\/h2>\n<p><\/p>\n<h3 id=\"podgotovka-ci-runner\">Preparaci\u00f3n del CI Runner<\/h3>\n<p><\/p>\n<p>Una vez que tengas todos estos datos, pasamos a la configuraci\u00f3n del GitLab Runner en un dispositivo MacOS. Desafortunadamente, crear aplicaciones iOS solo es posible en MacOS. Pero todo puede cambiar, y si esperas avances en este \u00e1rea, sigue proyectos como <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/facebook\/xcbuild\">xcbuild<\/a><\/noindex> y <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/saucelabs\/isign\">isign<\/a><\/noindex>, y nuestra tarea interna <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>Configurar el runner es muy sencillo. Sigue las <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/runner\/install\/osx.html\">instrucciones actualizadas para configurar GitLab Runner en macOS<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Nota. El runner debe utilizar el programa ejecutable <code>shell<\/code>. Esto es obligatorio para compilar iOS en macOS, para trabajar directamente como usuario y no a trav\u00e9s de contenedores. Si est\u00e1s utilizando <code>shell<\/code>, la compilaci\u00f3n y prueba se realizan bajo el nombre del usuario del runner, directamente en el host de compilaci\u00f3n. Esto no es tan seguro como los contenedores, as\u00ed que es mejor revisar la <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/runner\/security\/#usage-of-shell-executor\">documentaci\u00f3n de seguridad<\/a><\/noindex>, para no dejar nada al azar.<\/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>El llavero de Apple debe estar configurado en este host con acceso a las claves que Xcode necesita para la compilaci\u00f3n. La forma m\u00e1s sencilla de probar esto es iniciar sesi\u00f3n como el usuario que ejecutar\u00e1 la compilaci\u00f3n e intentar realizar la compilaci\u00f3n manualmente. Si el sistema solicita acceso al llavero, selecciona \"Siempre permitir\" para que CI funcione. Puede que valga la pena iniciar sesi\u00f3n y observar los primeros par de pipelines, para asegurarte de que ya no solicitan el llavero. El problema es que Apple no facilita el trabajo con el modo autom\u00e1tico, pero una vez que lo configures, todo deber\u00eda estar bien.<\/p>\n<p><\/p>\n<h3 id=\"fastlane-init\">fastlane init<\/h3>\n<p><\/p>\n<p>Para utilizar fastlane en el proyecto, ejecuta <code>fastlane init<\/code>. Simplemente sigue las <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/getting-started\/ios\/setup\/\">instrucciones para instalar y ejecutar fastlane<\/a><\/noindex>, especialmente en la secci\u00f3n sobre <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/getting-started\/ios\/setup\/#use-a-gemfile\">Gemfile<\/a><\/noindex>, ya que necesitamos un inicio r\u00e1pido y predecible a trav\u00e9s del pipeline automatizado de CI.<\/p>\n<p><\/p>\n<p>En el directorio del proyecto, ejecuta estos comandos:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">xcode-select --install\nsudo gem install fastlane -NV\n# Alternativamente usando Homebrew\n# brew cask install fastlane\nfastlane init<\/code><\/pre>\n<p><\/p>\n<p>fastlane te pedir\u00e1 la configuraci\u00f3n b\u00e1sica y luego crear\u00e1 en el proyecto una carpeta fastlane con tres archivos:<\/p>\n<p><\/p>\n<p><strong><code>1. fastlane\/Appfile<\/code><\/strong><\/p>\n<p><\/p>\n<p>No hay nada complicado aqu\u00ed. Simplemente verifica que el ID de Apple y el ID de la aplicaci\u00f3n est\u00e9n correctos.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">app_identifier(\"com.vontrance.flappybird\") # El identificador del paquete de tu aplicaci\u00f3n\napple_id(\"your-email@your-domain.com\") # Tu direcci\u00f3n de correo electr\u00f3nico de 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 los pasos de construcci\u00f3n. Usamos muchas capacidades integradas de fastlane, as\u00ed que aqu\u00ed tambi\u00e9n es claro. Creamos una l\u00ednea que obtiene los certificados, realiza la construcci\u00f3n y la sube a TestFlight. Puedes dividir este proceso en diferentes tareas si es necesario. Todas estas operaciones (<code>get_certificates<\/code>, <code>get_provisioning_profile<\/code>, <code>gym<\/code> y <code>upload_to_testflight<\/code>) ya est\u00e1n incluidas en fastlane.<\/p>\n<p><\/p>\n<p>Acciones <code>get_certificates<\/code> y <code>get_provisioning_profile<\/code> est\u00e1n relacionadas con el enfoque de firma <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-cert-and-sigh\">cert y sigh<\/a><\/noindex>. Si usas <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-match\">match<\/a><\/noindex> o algo m\u00e1s, realiza los cambios.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">default_platform(:ios)\n\nplatform :ios do\n  desc \"Construir la aplicaci\u00f3n\"\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>Este es un archivo opcional, pero lo cre\u00e9 manualmente para cambiar el directorio de salida predeterminado y colocar los resultados en la carpeta actual. Esto facilita la CI. Si te interesa, lee sobre <code>gym<\/code> y sus par\u00e1metros en <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/actions\/gym\/\">la documentaci\u00f3n<\/a><\/noindex>.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">https:\/\/docs.fastlane.tools\/actions\/gym\/<\/code><\/pre>\n<p><\/p>\n<p>Nuestro <strong><code>.gitlab-ci.yml<\/code><\/strong><\/p>\n<p><\/p>\n<p>As\u00ed que tenemos un corredor de CI para el proyecto y estamos listos para probar el pipeline. Veamos qu\u00e9 tenemos en <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>\u00a1Todo est\u00e1 perfecto! <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/getting-started\/ios\/setup\/#set-up-environment-variables\">Establecemos el formato UTF-8 para fastlane, como se requiere<\/a><\/noindex>, usamos la estrategia <code>clone<\/code> con el ejecutable <code>shell<\/code>, para tener un espacio de trabajo limpio para cada construcci\u00f3n, y simplemente llamamos a <code>flappybuild<\/code> fastlane, como se muestra arriba. Como resultado, obtenemos la construcci\u00f3n, firma y despliegue de la \u00faltima construcci\u00f3n en TestFlight.<\/p>\n<p><\/p>\n<p>Tambi\u00e9n obtenemos el artefacto y lo guardamos con la construcci\u00f3n. Ten en cuenta que el formato <code>.ipa<\/code> es un archivo ejecutable ARM firmado, que no se puede ejecutar en el simulador. Si deseas resultados para el simulador, simplemente a\u00f1ade un objetivo de construcci\u00f3n que lo genere y luego incl\u00fayelo en la ruta del artefacto.<\/p>\n<p><\/p>\n<h3 id=\"drugie-peremennye-sredy\">Otras variables de entorno<\/h3>\n<p><\/p>\n<p>Aqu\u00ed hay un par de variables de entorno en las que todo funciona.<\/p>\n<p><\/p>\n<p><strong><code>FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD<\/code><\/strong> y <strong><code>FASTLANE_SESSION<\/code><\/strong><\/p>\n<p><\/p>\n<p>Para la autenticaci\u00f3n en la App Store y la carga en TestFlight, se necesita autenticaci\u00f3n para fastlane. Para ello, crea una contrase\u00f1a de aplicaci\u00f3n que se utilizar\u00e1 en CI. Detalles <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/best-practices\/continuous-integration\/#use-of-application-specific-passwords-and-spaceauth\">aqu\u00ed<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Si tienes autenticaci\u00f3n de dos factores, crea una variable <code>FASTLANE_SESSION<\/code> (instrucciones all\u00ed mismo).<\/p>\n<p><\/p>\n<p><strong><code>FASTLANE_USER<\/code><\/strong> y <strong><code>FASTLANE_PASSWORD<\/code><\/strong><\/p>\n<p><\/p>\n<p>Para <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/codesigning\/getting-started\/#using-cert-and-sigh\">cert y sigh<\/a><\/noindex> llamamos al perfil de inicializaci\u00f3n y certificados bajo demanda, necesitas establecer variables <code>FASTLANE_USER<\/code> y <code>FASTLANE_PASSWORD<\/code>. Detalles <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/best-practices\/continuous-integration\/#environment-variables-to-set\">aqu\u00ed<\/a><\/noindex>. Esto no es necesario si utilizas otro m\u00e9todo de firma.<\/p>\n<p><\/p>\n<h3 id=\"v-zaklyuchenie\">En conclusi\u00f3n<\/h3>\n<p><\/p>\n<p>Vea c\u00f3mo funciona todo esto <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/jlenny\/flappyokr\">en mi ejemplo sencillo<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Espero que haya sido \u00fatil y que lo haya inspirado a trabajar con las compilaciones de iOS en su proyecto de GitLab. Aqu\u00ed hay m\u00e1s <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/best-practices\/continuous-integration\/\">consejos sobre CI<\/a><\/noindex> para fastlane, por si acaso. Quiz\u00e1s quiera usar <code>CI_BUILD_ID<\/code> (para compilaciones incrementales), para <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/best-practices\/continuous-integration\/gitlab\/#auto-incremented-build-number\">incrementar autom\u00e1ticamente la versi\u00f3n<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Otra gran funci\u00f3n de fastlane es <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.fastlane.tools\/getting-started\/ios\/screenshots\/\">capturas de pantalla autom\u00e1ticas<\/a><\/noindex> para la App Store, que son muy f\u00e1ciles de configurar.<\/p>\n<p><\/p>\n<p>Comparta en los comentarios su experiencia y comparta ideas para mejorar GitLab para el desarrollo de aplicaciones iOS.<\/p>\n<p>Fuente: <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 - 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\/es\/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\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\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\/es\/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\udd47Publicamos aplicaciones iOS en la App Store con GitLab y fastlane | ProHoster","description":"C\u00f3mo GitLab con fastlane.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/publikuem-prilozheniya-ios-v-app-store-s-gitlab-i-fastlane","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/42201","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=42201"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/42201\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/42202"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=42201"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=42201"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=42201"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}