Passer au contenu principal
CI/CD

Automatic Capacitor IOS build with GitHub actions using match

Comment configurer une chaîne de construction continue et de validation (CI/CD) pour votre application IOS Ionic en utilisant fastlane et GitHub Actions en 5 minutes (2022)

Martin Donadieu

Martin Donadieu

Spécialiste du contenu

Automatic Capacitor IOS build with GitHub actions using match

Construction de builds iOS avec GitHub Actions utilisant Match

La mise en place de CI/CD pour les applications Capacitor peut être complexe et chronophage. Voici ce que vous devez savoir :

Nous recommandons maintenant d'utiliser Capgo Construisez avec le Capgo CLI pour les builds natives de Capacitor. Cette guide Fastlane Match est conservée pour les équipes qui maintiennent des pipelines d'actions GitHub existants, mais les nouveaux builds iOS devraient utiliser le Capgo CLI afin que vous ne deviez pas maintenir les dépôts Fastlane, Match, les exécutants Xcode, les certificats et les scripts d'envoi.

Prérequis

Avant de commencer, vous aurez besoin de configurer :

  • Un compte GitHub avec accès administrateur
  • L'adhésion au programme développeur iOS
  • L'accès API à App Store Connect avec les permissions appropriées
  • Une compréhension des workflows d'actions GitHub
  • Une connaissance de la configuration de Fastlane et Match
  • Du temps pour maintenir et déboguer la pipeline
  • Une équipe de nombreux devs, sinon nous recommandons d'utiliser fastlane cert pour des workflows plus simples

Configuration de CI/CD professionnelle par Capgo

Sauter la complexité. Capgo configure directement votre pipeline CI/CD dans votre plateforme préférée :

  • Independance de la plateforme: Fonctionne avec les GitHub Actions, GitLab CI ou autres
  • Intégration fluide: Pas de changement de plateforme nécessaire, fonctionne avec votre processus actuel
  • Configuration personnalisée: Configuration personnalisée adaptée aux besoins de votre projet
  • Expertise conseillère: Nous avons déjà configuré la CI/CD pour 50+ applications

Tarifs

  • Frais de configuration unique : 2 600 $
  • Vos coûts de fonctionnement : ~300 $ par an
  • Comparer à d'autres solutions propriétaires : 6 000 $ par an
  • Économisez 26 100 $ sur 5 ans

Configurer la CI/CD maintenant

Guide de configuration manuelle

Si vous souhaitez toujours configurer tout vous-même, voici ce dont vous avez besoin de faire :

Livraison continue pour iOS en utilisant Fastlane et GitHub Actions en utilisant match

Prérequis

Avant de continuer avec le tutoriel…

  • Assurez-vous d'avoir Fastlane installé sur votre machine de développement.
  • adhésion au programme de développeur iOS.
  • Désir de lire 😆…
  • Une équipe de nombreux devs, sinon nous recommandons d'utiliser fastlane cert pour des workflows plus simples.

Importants sur le prix

Prix GitHub Action

https://github.com/features/actions

Le service est ‘gratuit’ jusqu'à la limite, en fonction de la machine choisie.
Nous allons utiliser un ordinateur macOS machine, vous pouvez le voir dans l'écran d'affichage son prix et ses limites (tarifs au moment de la création du tutoriel, ils pourraient subir des changements à l'avenir)

🔴 Une fois averti des exigences et des prix, si vous le souhaitez, nous continuons…

📣 Dans l'article, on suppose que nous avons l'application créée dans iTunes connect, nous avons les certificats de l'écosystème Apple, tout sera copié par Fastlane!

Enfonçons-nous dans la matière 🤿

Étapes à suivre dans l'article

  1. Utilisation de App Store Connect API avec Fastlane Match
  2. Exigences
  3. Création d'une clé App Store Connect API
  4. Utilisation d'une clé App Store Connect API
  5. Copier les fichiers Fastlane
  6. Configurer Fastlane match
  7. Configurer Fastlane match

1. Utiliser App Store Connect API avec Fastlane Match

À compter de février 2021, l'authentification à deux facteurs ou la vérification à deux étapes est obligatoire pour tous les utilisateurs pour se connecter à App Store Connect. Cette couche supplémentaire de sécurité pour votre identifiant Apple vous aide à vous assurer que vous êtes la seule personne qui peut accéder à votre compte.
Depuis Support Apple

Pour commencer avec match, vous devez révoquer vos certificats existants. Mais n'ayez crainte, vous obtiendrez le nouveau directement.

Exigences

Pour pouvoir utiliser App Store Connect API, Fastlane a besoin de trois choses.

  1. Identifiant émetteur.
  2. Identifiant de clé.
  3. Fichier de clé ou contenu de clé.

Création d'une clé App Store Connect API

Pour générer des clés, vous devez avoir les droits d'administrateur dans App Store Connect. Si vous n'avez pas ces droits, vous pouvez diriger la personne concernée à cet article et suivre les instructions suivantes.

1 — Se connecter à App Store Connect.

2 — Sélectionner Utilisateurs et accès.

Accès à l'utilisateur App Store Connect

3 — Sélectionner l'onglet Intégration.

Intégration App Store Connect API

4 — Cliquez sur Générer la clé API ou le bouton Ajouter (+).

Les clés API de App Store Connect créent

5 — Entrez un nom pour la clé. Le nom est uniquement pour votre référence et n'est pas partie de la clé elle-même.

Les clés API de App Store Connect créent un nom

6 — Dans l'onglet Accès, sélectionnez le rôle pour la clé. Les rôles qui s'appliquent aux clés sont les mêmes rôles qui s'appliquent aux utilisateurs de votre équipe. Voir permissions des rôlesNous vous recommandons de sélectionner App manager.

7 — Cliquez sur Générer.

L'accès d'une clé API ne peut pas être limité à des applications spécifiques.

Le nom de la nouvelle clé, l'ID de la clé, un lien de téléchargement et d'autres informations apparaissent sur la page.

App Store Connect télécharge les clés

Vous pouvez trouver toutes les informations nécessaires ici.
<1> ID de l'incident.
<2> ID de la clé.
<3> Cliquez sur « Télécharger API Clé » pour télécharger votre API clé privée. Le lien de téléchargement n'apparaît que si la clé privée n'a pas encore été téléchargée. Apple ne garde pas de copie de la clé privée. Vous pouvez donc la télécharger qu'une seule fois.

🔴 Stockez votre clé privée dans un endroit sûr. Vous ne devriez jamais partager vos clés, stocker des clés dans un code dépôt, ou inclure des clés dans des code côté client.

Utilisation d'une clé API d'App Store Connect

Le fichier de clé API (fichier p8 que vous téléchargez), l'ID de la clé et l'ID de l'émetteur sont nécessaires pour créer le jeton JWT d'autorisation. Il existe plusieurs façons de saisir ces informations dans Fastlane à l'aide de l'action nouvelle de Fastlane, app_store_connect_api_key Vous pouvez apprendre d'autres façons dans Documentation de FastlaneJe montre cette méthode car je pense qu'elle est la plus facile à utiliser avec la plupart des CI, où vous pouvez définir des variables d'environnement.

Maintenant, nous pouvons gérer Fastlane avec la clé API d'App Store Connect, c'est génial !

2. Copiez les fichiers Fastlane

Fastlane est une bibliothèque Ruby créée pour automatiser les tâches de développement mobile courantes. En utilisant Fastlane, vous pouvez configurer des « voies » personnalisées qui rassemblent une série d'« actions » qui exécutent des tâches que vous effectueriez normalement à l'aide d'Android Studio. Vous pouvez faire beaucoup avec Fastlane, mais pour les besoins de ce tutoriel, nous utiliserons uniquement une poignée d'actions de base.

Créez un dossier Fastlane à la racine de votre projet et copiez les fichiers suivants : Fastfile

default_platform(:ios)

DEVELOPER_APP_IDENTIFIER = ENV["DEVELOPER_APP_IDENTIFIER"]
DEVELOPER_APP_ID = ENV["DEVELOPER_APP_ID"]
PROVISIONING_PROFILE_SPECIFIER = ENV["PROVISIONING_PROFILE_SPECIFIER"]
TEMP_KEYCHAIN_USER = ENV["TEMP_KEYCHAIN_USER"]
TEMP_KEYCHAIN_PASSWORD = ENV["TEMP_KEYCHAIN_PASSWORD"]
APPLE_ISSUER_ID = ENV["APPLE_ISSUER_ID"]
APPLE_KEY_ID = ENV["APPLE_KEY_ID"]
APPLE_KEY_CONTENT = ENV["APPLE_KEY_CONTENT"]
GIT_USERNAME = ENV["GIT_USERNAME"]
GIT_TOKEN = ENV["GIT_TOKEN"]

def delete_temp_keychain(name)
  delete_keychain(
    name: name
  ) if File.exist? File.expand_path("~/Library/Keychains/#{name}-db")
end

def create_temp_keychain(name, password)
  create_keychain(
    name: name,
    password: password,
    unlock: false,
    timeout: 0
  )
end

def ensure_temp_keychain(name, password)
  delete_temp_keychain(name)
  create_temp_keychain(name, password)
end

platform :ios do
  lane :build do
    build_app(
      configuration: "Release",
      workspace: "./ios/App/App.xcworkspace",
      scheme: "App",
      export_method: "app-store",
      export_options: {
        provisioningProfiles: { 
            DEVELOPER_APP_ID => "#{PROVISIONING_PROFILE_SPECIFIER}"
        }
      }
    )
  end
  lane :refresh_profiles do
    match(
      type: "development",
      force: true)
    match(
      type: "adhoc",
      force: true)
  end
  desc "Register new device"
  lane :register_new_device do  |options|
      device_name = prompt(text: "Enter the device name: ")
      device_udid = prompt(text: "Enter the device UDID: ")
      device_hash = {}
      device_hash[device_name] = device_udid
      register_devices(
                       devices: device_hash
                       )
    refresh_profiles
  end
  lane :closed_beta do
    keychain_name = TEMP_KEYCHAIN_USER
    keychain_password = TEMP_KEYCHAIN_PASSWORD
    ensure_temp_keychain(keychain_name, keychain_password)

    api_key = app_store_connect_api_key(
      key_id: APPLE_KEY_ID,
      issuer_id: APPLE_ISSUER_ID,
      key_content: APPLE_KEY_CONTENT,            
      duration: 1200,            
      in_house: false
    )

    match(
      type: 'appstore',
      git_basic_authorization: Base64.strict_encode64("#{GIT_USERNAME}:#{GIT_TOKEN}"),
      readonly: true,
      keychain_name: keychain_name,
      keychain_password: keychain_password,
      api_key: api_key
    )

    gym(
      configuration: "Release",
      workspace: "./ios/App/App.xcworkspace",
      scheme: "App",
      export_method: "app-store",
      export_options: {
        provisioningProfiles: { 
            DEVELOPER_APP_ID => "#{PROVISIONING_PROFILE_SPECIFIER}"
        }
      }
    )

    pilot(
      apple_id: "#{DEVELOPER_APP_ID}",
      app_identifier: "#{DEVELOPER_APP_IDENTIFIER}",
      skip_waiting_for_build_processing: true,
      skip_submission: true,
      distribute_external: false,
      notify_external_testers: false,
      ipa: "./App.ipa"
    )

    delete_temp_keychain(keychain_name)
  end
  lane :submit_review do
    version = ''
    Dir.chdir("..") do
      file = File.read("package.json")
      data = JSON.parse(file)
      version = data["version"]
    end
    deliver(
      app_version: version,
      submit_for_review: true,
      automatic_release: true,
      force: true, # Skip HTMl report verification
      skip_metadata: false,
      skip_screenshots: false,
      skip_binary_upload: true
    )
  end
end

Appfile

app_identifier(ENV["DEVELOPER_APP_IDENTIFIER"])
apple_id(ENV["FASTLANE_APPLE_ID"])
itc_team_id(ENV["APP_STORE_CONNECT_TEAM_ID"])
team_id(ENV["DEVELOPER_PORTAL_TEAM_ID"])

Configurez Fastlane match

Fastlane match is a new approach to iOS’s code signing. Fastlane match makes it easy for teams to manage the required certificates and provisioning profiles for your iOS apps.

Créez un nouveau dépôt privé nommé certificates, par exemple sur votre compte ou organisation personnel GitHub.

Initialisez Fastlane match pour votre application iOS.

fastlane match init

Sélectionnez ensuite l'option #1 (Stockage Git).

[01:00:00]: fastlane match supports multiple storage modes, please select the one you want to use:1. git2. google_cloud3. s3?

Affectez l'URL du dépôt créé récemment.

[01:00:00]: Please create a new, private git repository to store the certificates and profiles there[01:00:00]: URL of the Git Repo: <YOUR_CERTIFICATES_REPO_URL>

Vous avez maintenant à l'intérieur du dossier Fastlane un fichier nommé Matchfile et il doit être configuré sur l'URL HTTPS du référentiel des certificats. Vous pouvez également utiliser SSH, mais cela nécessite une étape différente pour exécuter. _git_url_Ensuite, nous allons générer les certificats et entrer vos informations de connexion lorsque vous serez invité avec Fastlane Match.

# ios/Matchfilegit_url("https://github.com/gitusername/certificates")storage_mode("git")type("appstore")

Vous serez invité à entrer un mot de passe. Rappelez-vous-le correctement car il sera utilisé ultérieurement par les Actions de __CAPGO_KEEP_0__ pour déchiffrer votre référentiel des certificats.

You will be prompted to enter a passphrase. Remember it correctly because it will be used later by GitHub Actions to decrypt your certificates repository.

fastlane match appstore

Si vous avez rencontré un problème avec __CAPGO_KEEP_0__ et les permissions nécessaires, peut-être que ce

[01:40:52]: All required keys, certificates and provisioning profiles are installed 🙌

If you experienced any problem with GitHub and the necessary permissions, maybe this vous aidera à générer des jetons d'authentification pour git. Les certificats et les profils de provisionnement générés sont chargés dans les ressources du référentiel des certificats

App Store Connect certificats

post

Enfin, ouvrez votre project dans Xcode, et mettez à jour le profil de provisioning pour la configuration de sortie de votre application.

Certificats XCode

Quelques choses à noter 💡

MATCH

Pour que le CI/CD puisse importer les certificats et les profils de provisioning, il doit avoir accès au référentiel des certificats. Vous pouvez faire cela en générant un jeton d'accès personnel (qui doit être utilisé avant) qui a l'autorisation d'accéder ou de lire les référentiels privés.

Dans GitHub, allez à ParamètresRéglages du développeurJeton d'accès personnel → cliquez Generate New Token → cochez la case repo scope → puis cliquez Generate token.

Créer un jeton d'accès personnel

Vous devez avoir une copie du jeton d'accès personnel généré. Vous l'utiliserez plus tard pour la variable d'environnement GIT_TOKEN.

Puis remplacez votre fichier match généré dans le dossier Fastlane par Matchfile

CERTIFICATE_STORE_URL = ENV["CERTIFICATE_STORE_URL"]
GIT_USERNAME = ENV["GIT_USERNAME"]
GIT_TOKEN = ENV["GIT_TOKEN"]
FASTLANE_APPLE_ID = ENV["FASTLANE_APPLE_ID"]

git_url(CERTIFICATE_STORE_URL)
storage_mode("git")
type("appstore")
git_basic_authorization(Base64.strict_encode64("#{GIT_USERNAME}:#{GIT_TOKEN}"))
username(FASTLANE_APPLE_ID)

Cela sera utilisé par les GitHub Actions pour importer les certificats et les profils de provisionnement. Et la variable sera définie dans les GitHub Secrets, au lieu de les coder en dur dans le fichier.

Traitement de la construction

Dans les GitHub Actions, vous êtes facturé en fonction des minutes que vous avez utilisées pour exécuter votre flux de travail CI/CD. D'expérience, il faut environ 10–15 minutes avant que la construction puisse être traitée dans App Store Connect.

Pour les projets privés, le coût estimé par construction peut aller jusqu'à $0,08/min x 15 min = $1,2, ou plus, en fonction de la configuration ou des dépendances de votre projet.

Si vous partagez les mêmes préoccupations concernant le prix que moi pour les projets privés, vous pouvez conserver le skip_waiting_for_build_processing à true.

Quel est le piège ? Vous devez mettre à jour manuellement la conformité de votre application dans App Store Connect après que le build a été traité, afin de distribuer le build à vos utilisateurs.

C'est juste un paramètre facultatif à mettre à jour si vous voulez économiser sur les minutes de build pour les projets privés. Pour les projets gratuits, ce ne devrait pas être un problème du tout. Voir tarification.

3. Paramètressez les GitHub Actions

Configurer les GitHub secrets

Vous vous demandez peut-être où les valeurs des ENV viennent ? Eh bien, ce n'est plus un secret – c'est de votre projet secret. 🤦

Définir les GitHub secrets

1. APP_STORE_CONNECT_TEAM_ID - l'ID de votre équipe d'App Store Connect si vous êtes dans plusieurs équipes.

2. DEVELOPER_APP_ID - dans App Store Connect, allez dans l'application → Informations sur l'application → Descendez jusqu'à la section de votre application et cherchez General Information les éléments suivants : Apple ID.

3. DEVELOPER_APP_IDENTIFIER - l'identifiant de votre application.

4. DEVELOPER_PORTAL_TEAM_ID - l'ID de votre équipe de portail des développeurs si vous êtes dans plusieurs équipes.

5. FASTLANE_APPLE_ID - l'ID Apple ou l'adresse e-mail de développeur que vous utilisez pour gérer l'application.

6. GIT_USERNAME & GIT_TOKEN - votre nom d'utilisateur Git et votre jeton d'accès personnel.

7. MATCH_PASSWORD - la phrase de passe que vous avez assignée lors de l'initialisation de match, qui sera utilisée pour déchiffrer les certificats et les profils de provisionnement.

8. PROVISIONING_PROFILE_SPECIFIER - match AppStore <YOUR_APP_BUNDLE_IDENTIFIER>par exemple : match AppStore com.domain.blabla.demo.

9. TEMP_KEYCHAIN_USER & TEMP_KEYCHAIN_PASSWORD - attribuez un utilisateur et un mot de passe de clé temporaire pour votre flux de travail.

10. APPLE_KEY_ID — App Store Connect API Clé 🔺ID de clé.

11. APPLE_ISSUER_ID — App Store Connect API Clé 🔺ID émetteur.

12. APPLE_KEY_CONTENT — App Store Connect API Clé 🔺Fichier de clé ou contenu de .p8, vérifiez-le

13. CERTIFICATE_STORE_URL — L'URL du référentiel de vos clés Match (ex: https://github.com/***/fastlane_match.git)

4. Configurez le fichier de workflow GitHub

Créez un répertoire de workflow GitHub

cd .github/workflows

À l'intérieur du dossier, créez un fichier nommé workflow et ajoutez les lignes suivantes. build-upload-ios.yml5. Configurez le fichier de workflow __CAPGO_KEEP_0__

name: Build source code on ios

on:
  push:
    tags:
      - '*'

jobs:
  build_ios:
    runs-on: macOS-latest
    steps:
      - uses: actions/checkout@v6
      - name: set Node.js
        uses: actions/setup-node@v6
        with:
          node-version: '24'
          cache: npm
      - name: Install dependencies
        id: install_code
        run: npm ci
      - name: Build
        id: build_code
        run: npm run build
      - uses: actions/cache@v5
        with:
          path: ios/App/Pods
          key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }}
          restore-keys: |
            ${{ runner.os }}-pods-
      - name: Sync
        id: sync_code
        run: npx cap sync
      - uses: ruby/setup-ruby@v1
        with:
          ruby-version: 2.7.2
      - uses: maierj/fastlane-action@v2.3.0
        env:
          DEVELOPER_APP_IDENTIFIER: ${{ secrets.DEVELOPER_APP_IDENTIFIER }}
          DEVELOPER_APP_ID: ${{ secrets.DEVELOPER_APP_ID }}
          PROVISIONING_PROFILE_SPECIFIER: match AppStore ${{ secrets.DEVELOPER_APP_IDENTIFIER }}
          TEMP_KEYCHAIN_USER: ${{ secrets.TEMP_KEYCHAIN_USER }}
          TEMP_KEYCHAIN_PASSWORD: ${{ secrets.TEMP_KEYCHAIN_PASSWORD }}
          APPLE_ISSUER_ID: ${{ secrets.APPLE_ISSUER_ID }}
          APPLE_KEY_ID: ${{ secrets.APPLE_KEY_ID }}
          APPLE_KEY_CONTENT: ${{ secrets.APPLE_KEY_CONTENT }}
          CERTIFICATE_STORE_URL: https://github.com/${{ secrets.CERTIFICATE_STORE_REPO }}.git
          GIT_USERNAME: ${{ secrets.GIT_USERNAME }}
          GIT_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
          FASTLANE_APPLE_ID: ${{ secrets.FASTLANE_APPLE_ID }}
          MATCH_USERNAME: ${{ secrets.FASTLANE_APPLE_ID }}
          MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
          APP_STORE_CONNECT_TEAM_ID: ${{ secrets.APP_STORE_CONNECT_TEAM_ID }}
          DEVELOPER_PORTAL_TEAM_ID: ${{ secrets.DEVELOPER_PORTAL_TEAM_ID }}
        with:
          lane: closed_beta
      - name: Upload release bundle
        uses: actions/upload-artifact@v2
        with:
          name: ios-release
          path: ./App.ipa
          retention-days: 60

Ce flux de travail doit être déclenché après chaque GitHub tagSi vous avez besoin d'automatiser les étiquettes, veuillez vous référer à Construction automatique et de mise en production avec GitHub actions Premièrement.

Ensuite, ce flux de travail tirera vos dépendances NodeJS, les installera et construira votre application JavaScript.

Chaque fois que vous envoyez un nouveau commit, une mise en production sera créée dans TestFlight.

Votre application n'a pas besoin d'utiliser Ionic, seule la base Capacitor est obligatoire. Elle peut avoir des anciens modules Cordova, mais le plugin Capacitor JS est préféré.

5. Déclencher le flux de travail

Créer un Commit

Faire un commit, vous devriez voir le flux de travail actif dans le dépôt.

Déclencher le flux de travail

Pousser les nouveaux commits vers la branche main ou development pour déclencher le flux de travail.

Démarré avec le commit

Après quelques minutes, le build devrait être disponible dans votre tableau de bord App Store Connect.

Tableau de bord Testflight

Pouvez-vous déployer depuis la machine locale ?

Oui, vous pouvez, et cela est facile.

Imaginez que vous avez un dépôt privé, et que vous avez utilisé toutes les minutes de la version gratuite et que vous ne voulez pas payer pour les nouvelles versions, ou peut-être préférez-vous soumettre l'application manuellement.

Allons-y pour cela

D'accord, nous devons d'abord créer dans mon chemin de projet/fastlane chemin un fichier appelé .env, simplement dans le même chemin que Fastfile, afin de pouvoir créer les mêmes propriétés secrètes trouvées dans notre ___CAPGO_KEEP_0__, comme suit : properties found in our _GitHub, a_s below:

Maintenant, vous pouvez vous rendre au

terminal bun et lancer le Fastlane à partir de votre machine :

fastlane closed_beta

❌ Informations essentielles sur le .env fichier, car nous préférons ne pas exposer ces données, nous devons donc les ajouter dans notre .gitignore, quelque chose comme cela : ❌

fastlane/*.env

Il devrait fonctionner de la même manière que cela se produit à partir des GitHub Actions sur la machine distante, mais sur notre machine locale. 🍻

Exécution locale de Fastlane

Exécution du terminal : $ Fastlane closed_beta

Si vous avez réussi à cette étape, mes félicitations, vous avez maintenant un processus entièrement automatisé pour vos applications iOS avec Fastlane et GitHub Actions.

Chaque fois que vous envoyez un nouveau commit, une mise à jour sera construite dans le console Google Play, canal bêta. martin@capgo.app

Construire sur votre appareil

Si vous avez encore besoin de construire sur votre appareil, vous devez les ajouter manuellement à la provisionnement. Connectez votre appareil à votre Mac et ouvrez le menu appareil Trouvez le menu iOS Copiez ensuite votre identifiant Trouvez l'identifiant iOS fastlane register_new_device Et commencez ensuite la commande : Il vous demandera de définir un nom d'appareil et l'identifiant :

Si vous avez des problèmes

Si vous avez des problèmes avec le dispositif de développement qui ne peut pas tester, etc. cela devrait généralement le résoudre.

Il existe une commande magique qui peut vous sauver :

fastlane match nuke development
fastlane match development

Ensuite : Nettoyez le projet en maintenant Shift(⇧)+Command(⌘)+K ou en sélectionnant Produit > Nettoyer (il pourrait être étiqueté « Nettoyer le dossier de construction »)

Essayez ensuite de lancer à nouveau l'application sur votre appareil.

Merci

Cet article est basé sur les articles suivants :

Mises à jour en temps réel pour les applications Capacitor

Lorsqu'un bug de la couche web est en ligne, expédiez la correction par Capgo au lieu d'attendre des jours pour l'approbation de la boutique d'applications. Les utilisateurs reçoivent la mise à jour en arrière-plan tandis que les modifications natives restent dans la voie de revue normale.

Commencez maintenant

Dernières actualités de notre Blog

Capgo vous donne les meilleures informations dont vous avez besoin pour créer une application mobile vraiment professionnelle.