Aller au contenu principal
Tutoriel

Apple autorise-t-il les live updates sans revue de l'App Store ?

Oui, avec certaines limites. Apple autorise les mises à jour OTA de code interprétés comme le JavaScript, tant que l'application conserve sa fonction initiale. Voici la règle exacte et son application aux applications Capacitor.

Apple autorise-t-il les live updates sans revue de l'App Store ?

Réponse courte : oui, Apple autorise les live updates, dans certaines limites. Vous pouvez pousser du nouveau JavaScript, HTML et CSS vers une app iOS sans nouvelle revue de l'App Store, tant que la mise à jour ne change pas la nature de l'app. Vous ne pouvez pas télécharger de code natif.

La confusion vient souvent de la confusion entre deux choses : les live updates de code interprétés (autorisés) et le téléchargement de nouveaux code exécutables (non autorisés). Cette page cite les règles, montre où se situe la limite et explique comment Apple l'applique.

Ceci ne constitue pas un conseil juridique. C'est ainsi que les règles sont rédigées aujourd'hui et ainsi que des milliers d'apps les utilisent en production.

Ce que disent réellement les règles d’Apple

Deux textes sont essentiels. Le premier est la directive 2.5.2 de l'App Store Review:

Les applications doivent être autonomes dans leurs bundles et ne peuvent ni lire ni écrire de données en dehors de la zone de conteneur désignée, ni télécharger, installer ou exécuter code qui introduit ou modifie des fonctionnalités de l'application, y compris d'autres applications.

Pris isolément, cela ressemble à une interdiction. L'exception se trouve dans le second texte, section 3.3.1(B) du Contrat de licence Apple Developer Program, que chaque développeur signe :

Du code interprété peut être téléchargé vers une application, mais seulement tant que ce code : (a) ne modifie pas l'objectif principal de l'application en fournissant des fonctionnalités incompatibles avec l'objectif prévu et annoncé de l'application telle que soumise à l'App Store, (b) ne crée pas un store ou une vitrine pour d'autres code ou applications, et (c) ne contourne pas la signature, le sandbox ou d'autres fonctions de sécurité de l'OS.

La règle n'est donc pas « pas de code téléchargé ». C'est « pas de natif code téléchargé, et du code interprété uniquement sous trois conditions ».

La couche web d'une application Capacitor est composée de JavaScript, HTML et CSS s'exécutant dans WKWebView, qui est le moteur WebKit d'Apple. Celui-ci est interprété code, il entre donc dans l'exception. La règle 4.7 va dans le même sens : Apple autorise explicitement les apps à exécuter du contenu HTML5 et JavaScript qui n'est pas intégré au binaire.

Où se situe la limite

Autorisé avec un live update Non autorisé avec un live update
Corrections de bugs en JavaScript, HTML, CSS Téléchargement de Swift, Objective-C ou de tout binaire compilé
Changements d'UI, de textes ou nouveaux écrans dans votre stack web existante Transformer l'app en un produit différent (une app de notes qui devient un casino)
Tests A/B et déploiements progressifs de code web Débloquer des fonctionnalités cachées à l'App Review
Mise à jour d'images, de traductions, de config Créer un store qui installe d'autres apps ou code
Faire un rollback d'une mauvaise release Contourner le sandbox, la signature ou les permissions iOS

Capgo ne déploie que la colonne de gauche. Il remplace le bundle web à l'intérieur de votre application. Tout ce qui est natif, comme un nouveau plugin Capacitor, une nouvelle permission ou une mise à jour SDK, nécessite toujours une release classique sur l'App Store. Les Capgo ciblage de version garantissent qu'un bundle nécessitant de nouveaux code natifs n'atteigne jamais un ancien binaire.

Comment Apple l’applique

Apple juge le fond, pas la technologie. Personne n'est sanctionné pour corriger une faute de frappe via une mise à jour OTA. Ce que Apple traque, c'est une application qui passe la revue en étant une chose et qui en devient une autre après. Cela concerne autant la règle 2.3.1 (pas de fonctionnalités cachées ou non documentées) que la 2.5.2.

En pratique :

  • Déployez ce que vous auriez soumis, mais plus rapidement.
  • Gardez chaque mise à jour conforme à l'usage décrit dans votre fiche App Store.
  • Passez les lancements de fonctionnalités majeures par l'App Review, et utilisez les live updates pour les correctifs et l'itération entre les releases.
  • N'utilisez jamais un live update pour activer un comportement que les relecteurs n'ont pas vu.

Dans cette logique, les live updates font naturellement partie de la livraison d'une app iOS. Les équipes React Native le font depuis des années avec CodePush et Expo Updates, et les équipes Capacitor le font avec Capgo.

Quelles stacks le permettent sur iOS ?

La possibilité pour votre app de déployer des mises à jour OTA sur iOS dépend d'une question : votre logique applicative est-elle interprétée au runtime ? JavaScript et les autres code interprétés, oui. Swift, Objective-C et C++ compilés en code machine, non. Les frameworks compilés AOT comme Flutter ne sont éligibles que via un interpréteur.

Compatibilité live update sur iOS par stack

Stack Comment le code s'exécute sur iOS Live updates autorisés ? Outils
Capacitor JavaScript, HTML, CSS dans WKWebView (WebKit) Oui Capgo
Ionic (sur Capacitor) Identique à Capacitor Oui Capgo
Cordova JavaScript dans WKWebView Oui Capgo après la migration vers Capacitor, les anciens plugins Cordova
React Native / Expo bundle JS sur Hermes ou JavaScriptCore Oui, uniquement du JavaScript Expo Updates, alternatives self-hosted à CodePush
NativeScript JavaScript sur un moteur embarqué Oui, uniquement du JavaScript Limité, principalement du sur-mesure
Flutter Dart compilé en AOT vers le code machine code Uniquement via un interpréteur Shorebird (interpréteur Dart pour les patchs)
Swift / Objective-C natif Code machine code Non pour le code natif ; oui pour le JavaScript dans WebKit ou JavaScriptCore Config à distance et UI pilotée par le serveur
.NET MAUI / Xamarin C# compilé en code machine via AOT Non Configuration à distance uniquement
Kotlin / Compose Multiplatform Kotlin/Native compilé en code machine Non Configuration à distance uniquement
Unity / Unreal C# via IL2CPP ou C++, compilé Non pour code, oui pour le contenu Bundles d'assets, contenu scripté (Lua)
Web wrapper (URL distante) Site web chargé dans une WebView Toujours en direct, mais risque de revue Aucun requis, voir la note ci-dessous

Capacitor, Ionic et Cordova : entièrement couverts

Your app’s web UI and JavaScript business logic run in WKWebView, tandis que le shell natif et les plugins restent natifs. La section 3.3.1(B) du contrat de licence du programme Apple Developer autorise le code interprété téléchargé uniquement s'il préserve la fonction principale de l'app, ne crée pas une code de type storefront, et ne contourne pas la sécurité de l'OS. La directive 4.7 régit séparément les apps proposant des mini-apps HTML5 et JavaScript et ajoute des exigences supplémentaires.

Un live update remplace le bundle web. Le shell natif, les plugins et les permissions restent ceux qu'Apple a examinés. C'est pourquoi Capgo est conforme par conception : il ne peut pas modifier les code natifs, même si vous le vouliez. Les nouveaux plugins ou permissions natifs nécessitent toujours une release sur l'App Store.

React Native et Expo : le JavaScript oui, les modules natifs non

React Native exécute votre bundle JavaScript sur Hermes ou JavaScriptCore. Ce bundle est un code interprété et peut être mis à jour via Live Update, ce qui est précisément le rôle d'Expo Updates et de Microsoft CodePush (retiré en 2025). Les équipes qui quittent CodePush un remplacement.

Tout changement des modules natifs, de la version React Native, ou Info.plist nécessite un nouveau binaire.

Flutter : uniquement via un interpréteur

Sur iOS, Flutter compile le Dart à l'avance en code machine ARM code. Le téléchargement d'un nouveau code machine est interdit, donc le Flutter standard ne peut pas utiliser les live updates. Shorebird résout cela en exécutant du Dart patché code via un interpréteur, ce qui le place sous l'exception de l'code interprété. En savoir plus dans les live updates pour les apps Flutter.

Swift natif, .NET MAUI, Kotlin Multiplatform : pas de mises à jour code natives

Ces stacks produisent du code machine natif. Elles ne peuvent pas télécharger de code natif de remplacement. Une application native peut tout de même télécharger et exécuter du code interprété, comme du JavaScript via JavaScriptCore, si elle respecte les conditions d'Apple. Ce que vous pouvez aussi faire via OTA, c'est modifier des données : remote config, feature flags pour des fonctionnalités déjà validées, UI pilotée par le serveur, images et textes.

Unity et moteurs de jeu : contenu oui, code non

Le code de jeu est compilé. Les asset bundles (niveaux, art, données d'équilibrage) sont du contenu et peuvent être téléchargés. Les langages de scripting embarqués comme Lua sont des code interprétés et suivent les mêmes règles que le JavaScript.

Wrappers d'URL distants : possible, mais risqué pour la validation

Une application qui ne fait que charger votre site web dans une WebView est « mise à jour » à chaque déploiement du site. Le problème n'est pas la règle 2.5.2, mais la règle 4.2 (fonctionnalité minimale) : Apple rejette les apps qui ne sont qu'un site web dans une frame. Compiler l'app web avec Capacitor, ajouter des fonctionnalités natives et utiliser les live updates permet d'éviter cela.

Ce qu'aucune stack ne peut faire sur iOS

Quel que soit votre framework, un live update ne peut pas :

  • Télécharger des code natifs, des frameworks ou des bibliothèques dynamiques
  • Ajouter de nouvelles permissions ou entitlements
  • Transformer l'app en quelque chose que la fiche de l'App Store ne décrit pas
  • Activer des fonctionnalités qui ont été cachées lors de l'App Review

Quelle est la suite ?

Ship fixes today, not after review

les live updates Capgo envoyez vos changements JavaScript, HTML et CSS vers votre application Capacitor en quelques minutes, avec des canaux, des rollbacks, des mises à jour delta et un chiffrement de bout en bout. C'est open source et auto-hébergeable.

bunx @capgo/cli@latest init

Consultez la démarrage rapide pour envoyer votre première mise à jour.

Live updates pour les apps Capacitor

Lorsqu'un bug de la couche web est en ligne, déployez le correctif via Capgo au lieu d'attendre des jours l'approbation des stores. Les utilisateurs reçoivent la mise à jour en arrière-plan, tandis que les changements natifs suivent le circuit de validation habituel.

Les derniers articles du blog

Capgo vous offre les meilleures informations pour créer une application mobile vraiment professionnelle.