Liens utiles
- Google Play Console : publier l'application sur le Play Store (Android)
- Apple Developer : gérer l'application sur iOS
- La publication de l'application nécessite un Mac et un iPhone, celle-ci se fait par l'intermédiaire de Xcode
- Console Firebase : pour gérer Cloud Messaging, App Distribution et Dynamic Links
1. Configuration de l'application
Cloner le dépôt et se rendre à la racine du projet.
git clone git@forge.com:flutter-project.git
Créer le fichier d'environnement.
cp .env.example .env
Le remplir avec les données suivantes pour la pré-prod :
Note : en mode debug
, l'application pré-remplira les champs de connexion à l'application, les champs APP_INVESTOR_EMAIL
& APP_INVESTOR_PASSWORD
ne sont donc utiles qu'en mode debug
API=https://domain.comAPP_INVESTOR_EMAIL=use@mail.comAPP_INVESTOR_PASSWORD=passwordDEBUG_RELEASE=false
Télécharger les dépendances de pub.
flutter pub get
Lancer l'application sur un émulateur ou sur un appareil Android branché sur votre machine. Il est possible de lancer l'application depuis Visual Studio Code si vous le souhaitez.
flutter run
En cas de problème
Si vous rencontrez des problèmes, à n'importe quel moment, vous pouvez exécuter les commandes suivantes avant de relancer flutter run
flutter clean ; flutter pub get
2. Connexion à l'API
Utilisez de préférence une API déployée, que ce soit la pré-prod ou la prod.
TODO: ngrok, expose, method to get images
2. a. Communication entre Laravel & Flutter
TODO: Laravel transformers, flutter models
3. Firebase
Firebase est un service de Google proposant plusieurs offres pour divers supports mais surtout pour les applications Android & iOS, le support de Flutter est aussi assuré.
- Console Firebase : gérer les notifications push avec Cloud Messaging
- FlutterFire : documentation de FlutterFire qui permet de faire communiquer Flutter avec Firebase.
Firebase est utilisé sur l'application pour les *notifications push- avec Cloud Messaging, la distribution de versions de tests avec *App Distribution- et le deep linking avec Dynamic Links, tous ces services étant disponibles dans la console de Firebase du projet com-group-project
.
# 3. a. Notifications push
Faites avec Firebase Cloud Messaging, vous pouvez trouver davantage d'informations sur Notifications push.
3. b. Deep linking
Le deep-linking est la solution à un problème simple : la redirection de l'utilisateur en fonctionne de la plateforme. Si l'utilisateur se trouver sur un navigateur de desktop, le lien vers l'application le redirigera vers le Store concerné, alors que si l'utilisateur se trouve sur un navigateur de mobile, le lien ouvrira l'application si elle est installée ou directement le Store pour la télécharger.
Le but est de garder l'utilisateur dans l'environnement de l'application et lui demander le moins d'efforts possibles. Il est donc possible d'envoyer des payloads par ces redirections pour ouvrir directement une page dans l'application.
Il peut être complexe de mettre en place le deep-linking, par conséquent Firebase offre un service : *Dynamic Links- pour permettre de le faire facilement.
TODO: plugins flutter, firebase dynamic links
4. Déploiement
Avant tout déploiement, il est fortement conseillé d'exécuter un clean
du projet.
flutter cleanflutter pub get
Android & iOS
Déployer une application sur Android peut être assez long mais par rapport au déploiement iOS, il devient presque facile. Mais peu importe le support, c'est un processus qui est long et compliqué, il demande également de mettre des fichiers de certificats et des clés en place ce qui peut être délicat.
4. a. Versioning
Toute application est versionnée, tant que celle-ci n'est pas publiée, la version n'est utile que pour distinguer vos différentes releases de test mais lorsque vous rentrerez en phase de publication, il sera nécessaire de versionner systématiquement vos changements en suivant une forme de versioning comme le semantic versioning .
Vous trouverez la version de l'application dans le pubspec.yaml
à la racine du projet Flutter. Celle-ci est divisée en deux parties, la version et le build number. Le plus important est la version, le build number pouvant être incrémenté à chaque nouvelle release.
version: 0.9.3+28
Extrait des informations disponibles dans le pubspec.yaml
The following defines the version and build number for your application. A version number is three numbers separated by dots, like 1.2.43 followed by an optional build number separated by a +. Both the version and the builder number may be overridden in flutter build by specifying --build-name and --build-number, respectively. In Android, build-name is used as versionName while build-number used as versionCode. Read more about Android versioning at https://developer.android.com/studio/publish/versioning . In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. Read more about iOS versioning at [https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html"(https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html)
4. b. Clés
Les clés doivent toujours être gardées en lieu sûr afin de publier l'application.
TODO
ios/Runner/Info.plist
<key>LSSupportsOpeningDocumentsInPlace</key>
<true />
<key>UIFileSharingEnabled</key>
<true />
In iOS 11 and later, if both this keys LSSupportsOpeningDocumentsInPlace and the UIFileSharingEnabled key are YES, the local file provider grants access to all the documents in the app’s Documents directory. These documents appear in the Files app, and in a document browser. Users can open and edit these document in place.
ios/Runner/GoogleService-Info.plist
Add Google-Info.plist
Width of screen
- https://stackoverflow.com/questions/45822460/remove-apk-from-library-in-google-play-developer-console
- https://github.com/firebase/quickstart-unity/issues/861
- https://github.com/miguelpruivo/flutter_file_picker/wiki/Troubleshooting#-issue (optional)
- https://stackoverflow.com/questions/49286268/error-execution-failed-for-task-app-lintvitalrelease-any-one-can-solve-it
- https://developer.apple.com/forums/thread/649241
- https://developer.apple.com/forums/thread/128891
- https://stackoverflow.com/questions/51022884/ios-testflight-no-build-available-for-external-testers
LINKS
- https://github.com/flutter/flutter/issues/30287
- https://developer.apple.com/account/resources/certificates/list
- https://appstoreconnect.apple.com/apps/1543201094/appstore/ios/version/inflight
- https://play.google.com/console/u/2/developers/7197107450285986631/app/4972682542434992218/tracks/production
- https://help.apple.com/developer-account/#/devbfa00fef7
- https://help.apple.com/xcode/mac/current/#/devf37a1db04
- https://stackoverflow.com/questions/4156128/how-to-install-a-certificate-in-xcode-preparing-for-app-store-submission
- https://firebase.flutter.dev/docs/messaging/apple-integration/
- https://stackoverflow.com/questions/55220612/how-to-save-a-text-file-in-external-storage-in-ios-using-flutter
- https://github.com/fluttercommunity/flutter_launcher_icons/issues/216
- https://flutter.dev/docs/deployment/ios
- https://pub.dev/packages/flutter_launcher_icons
- https://github.com/fluttercommunity/flutter_launcher_icons/blob/master/example/default/pubspec.yaml
- https://pub.dev/packages/firebase_messaging
- https://medium.com/@SebastianEngel/easy-push-notifications-with-flutter-and-firebase-cloud-messaging-d96084f5954f
- https://medium.com/@fabiojansen86/flutter-android-receiving-push-notifications-sending-from-an-webapp-d2e43e19ba36
- https://fireship.io/lessons/flutter-push-notifications-fcm-guide/
keytool -list -v -keystore "\.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android
- https://firebase.google.com/docs/cloud-messaging/?authuser=1#implementation_paths
- https://firebase.google.com/docs/cloud-messaging/android/client?authuser=1
- https://firebase.google.com/support/release-notes/android#latest_sdk_versions
- https://app.onesignal.com/apps/c32ed7bc-dc4c-425f-9ad8-cdb2f1a5aaef/settings
- https://stackoverflow.com/questions/46454398/sending-firebase-notification-with-php
- https://pub.dev/packages/firebase_crashlytics/example
- https://firebase.flutter.dev/docs/crashlytics/usage
- https://developer.android.com/studio/build/shrink-code
cmds
- adb shell setprop debug.firebase.analytics.app com.group.project.flutter
- adb shell setprop debug.firebase.analytics.app .none.
- adb shell setprop log.tag.FA VERBOSE
- Connect to developer.apple.com with user@mail.com (you will need a code from phone number linked to account)
Connect to Xcode with user@mail.com (you will need another code from phone number)
- Xcode -> Preferences -> Accounts -> Check if account exist in list -> If not click on + to create new account
- It will create an Apple Developer certificate on developer.apple.com
- Generate certificate with Keychain Access app
- Keychain Access >> Certificate Assistant >> Request a Certificate From a Certificate Authority
- Select save on disk option
- Create a Apple distribution certificate on developer.apple.com, drag an drop certificate from Keychain and continue to create certificate
In Identifiers
- Create App ID, select App, enter a small description and in Bundle ID enter package name: com.group.project.flutter
- Select Accesss Wifi informations, Push Notifications
For Apple Push Notifs
- Create a new Key with Apple Push Notifications service enabled with a name reference the app (not really important)
- Continue, Register and Download it: you can't download it twice, keep it safe
- Current key: 39674F8RAV,
deploy/apple/AuthKey_39674F8RAV.p8