Un Mac est nécessaire pour toutes les étapes qui vont suivre, le Mac doit être sous la version 10.14 (Mojave) au minimum pour avoir accès à Xcode 11. Ceci est nécessaire pour la version de Flutter utilisée (v1.22), toute mise à jour de l'application concernant l'environnement sdk: ">=2.7.0 <3.0.0" (dans le pubspec.yml) pourrait nécessiter une version de Xcode plus récente et donc une version MacOS plus récente.

  • MacOS>= v10.14
  • Flutter >= v1.22 : nécessite d'installer le CLI de Flutter, disponible ici
  • Xcode >= v11
  • L'application peut tourner sous iOS 9 minimum mais l'upload de fichiers nécessite au minimum iOS 11 comme l'indique cette réponse sur Stackoverflow .

Le déploiement nécessite plusieurs étapes, générer les certificats sur developer.apple.com (ou les récupérer depuis le répertoire deploy), créer l'application sur appstoreconnect.apple.com et enfin configurer le Runner depuis Xcode.

  • Certificate deploy/apple/CertificateSigningRequest.certSigningRequest : certificat créé par Keychain Access
  • Certificate deploy/apple/distribution.cer : certificat de distribution
  • Profile deploy/apple/comproject.mobileprovision : provision
  • developer.apple.com : gérer les certificats, l'équipe de développement
  • appstoreconnect.apple.com : gérer l'application pour l'App Store

1. Flutter et Xcode

Pour ouvrir l'application Flutter avec Xcode, sélectionnez flutter-project/ios pour avoir accès à l'environnement de développment Apple et au Runner. Pour accéder au Runner qui représente l'application en test, rendez-vous dans le Project navigator et double cliquez sur Runner. Vous aurez le Project qui n'est pas très utile pour nous et Targets qui est très important pour la suite, en particlier pour l'onglet General, Signing & Capabilities et Build Phases.

Utiliser Flutter avec Xcode peut se révéler assez compliqué, notamment pour des questions de cache, si quelque chose ne fonctionne pas, n'hésitez pas à nettoyer l'application.

  • Avec Flutter : flutter clean
  • Avec Xcode : Product->Clean Build Folder

Vous pouvez vous assurer que de tout supprimer avec cette commande (fermez Xcode avant)

flutter clean
rm -Rf ios/Pods
rm -Rf ios/.symlinks
rm -Rf ios:Flutter/Flutter.framework
rm -Rf ios/Flutter/Flutter.podspec
rm ios/Podfile.lock
flutter pub get
cd ios
pod update
cd ../

Relancez le Runner d'Xcode après avoir effectué cette commande.

2. Configurer Firebase

Suivre les étapes Configuring your app et Linking APNS with FCM du guide FlutterFire . Les étapes listées dans ce guide seront également utiles pour plus tard, il est préférable de commencer par cette étape.

Fichiers nécessaires : la liste est disponible en haut de la page.

GoogleService-Info.plist

Le fichier est nécessaire pour faire fonctionner Cloud Messaging, il doit être dans la liste des fichiers dans Targets Runner->Build Phases->Copy Bundle Resources

3. Configurer le Runner sur Xcode

En théorie, l'étape précédente aura listé les points les plus importants mais vérifiez ceux-ci dans le Runner Targets->General :

  • Display Name: Project Name
  • Bundle identifier (le même que celui du Bundle ID dans Identifiers sur developer.apple.com) : com.group.project.flutter
  • Version de pubspec.yml
  • Build de pubspec.yml
  • Register un nouvel iPhone: Xcode, Runner-> Targets->Signing & Capabilities->All->Select Team->Register device

WARNING

Il faudra mettre à jour À CHAQUE FOIS ces données, si vous souhaitez déployer l'application, vous aurez à créer une archive et si une archive utilise déjà un numéro de version qui a été utilisé, vous aurez une erreur.

Si tout semble fonctionner, branchez un iPhone physique (l'iPhone doit être déverouillé) ou lancez un émulateur et exécutez le Runner avec l'icône Play en haut à gauche. En cas d'erreur, vérifiez les logs pour savoir quel est le problème. Si tout se passe bien, l'application devrait se lancer sur l'iPhone en mode debug. Vous pouvez lancer également l'application avec la commande flutter run depuis la racine du dépôt si vous avez au moins lancé une première fois le Runner afin de générer tout le nécessaire à l'application pour l'iPhone. Il est possible de lancer la commande de run de Flutter en même temps que le Runner d'Xcode ou en ayant arrêté le Runner. L'intérêt de la commande run de Flutter est d'avoir accès à tous les logs de l'application, le Runner disposant de logs mais vous ne retrouverez pas tous les logs utilisés par l'application.

3. a. Tester les notifications push

Lorsque l'application est lancée sur l'iPhone, il est important de voir si les notifications push fonctionnent. Celles-ci sont activées en mode background, retournez à l'accueil de l'iPhone et lancez la commande suivante dans un terminal MacOS/Linux : notifications push (utilisez la commande cURL). La notification push devrait arriver immédiatement.

3. b. Configurer le certificat de Distribution

Pour distribuer l'application il est nécessaire d'avoir un certificat de distribution. Sur Xcode, allez dans Xcode->Preferences->Accounts->Sélectionnez le compte concerné->Manage Certificates. Si vous ne voyez pas de certificat appelé Apple Distribution, appuez sur + et sélectionnez Apple Distribution pour en ajouter un.

4. Créer l'application

Sur appstoreconnect.apple.com vous devrez créer une nouvelle application si besoin. Pour l'UGS, mettez com.group.project.flutter. Vous devrez ajouter des screenshots (disponible sous Teams) et les informations de base de l'application.

Si vous avez besoin de prendre de nouveau screenshots, vous pouvez voir comment prendre des screenshots selon le modèle de l'iPhone sur cette page

L'application elle-même ne sera complète qu'une fois qu'elle sera déployée à travers Xcode qui, si tous les certificats sont valides, de déployer l'application pour les tests avant un déploiement sur l'App Store.

5. Déployer

Pour vous aider, n'hésitez pas à lire la page dédiée sur flutter.dev

WARNING

Cette étape est assez longue, environ 45 minutes si tout se passe bien, beaucoup de temps sera nécessaire pour que le Mac vérifie l'application mais vous aurez des questions auxquelles répondre de temps en temps.

N'hésitez pas à nettoyer l'application avec les commandes proposées précédement avant de déployer. Une fois le nettoyage effectué, lancez à nouveau le Runner depuis Xcode, si l'application se déploie correctement stopez-le et lancez la commande Flutter depuis le dépôt :

flutter build ios

TIP

Une fois que vous avez effecuté un build ios, vous pouvez installer l'application sur un appareil branché sur le Mac avec :

flutter install

Puis sur Xcode, sélectionnez Product->Archive pour créer une archive. Vous devrez répondre à plusieurs demande de la part d'Xcode et cela va prendre un certain temps, lorsque l'archive est terminée, sélectionnez Validate App pour vous assurer que tous les certificats sont valides (un certain nombre de question vous seront posées, il faudra généralement valider la réponse par défaut).

Les archives

Apple utilise un système d'archive qui va compiler l'application générée par Flutter afin de pouvoir la valider et ensuite l'uploader. Si vous avez déjà créé une archive avec une version spécifique, Xcode va refuser de générer une autre archive portant la même version, vous allez devoir supprimer l'ancienne version OU incrémenter la version actuelle pour pouvoir refaire une autre archive.

Pour consulter la liste des archives, sélectionnez Window->Organizer.

Ensuite, si vous voyez 'App "Runner" successfully validated.', vous pouvez sélectionner Distribute App qui représente presque la même chose avec des étapes supplémentaire dont l'upload sur l'App Store via Apple connect. Lorsque le déploiement sera terminé pour Xcode, vous devrez attendre quelques minutes pour que le build soit disponible sur appstoreconnect.apple.com et vous pourrez valider la nouvelle version.

5. a. Mettre à jour

TODO

6. TestFlight

Disponible sur les versions récentes, vous pouvez utiliser l'application TestFlight pour récupérer la version en déploiement directement sur un iPhone sans installer l'app via un Mac avec Flutter. Très utile pour montrer une app à un client.