Je suis construit une saveur différente de l'application Flutter avec un environnement de firebase différent (développement et production). J'ai besoin de définir différents identifiants pour le développement et la production en Xcode pour les applications iOS.
Je suis utilise des schémas pour configurer la saveur différente (dans les paramètres de construction I Ajouter une valeur d'environnement pour chaque configuration).
Mais j'ai un gros problème avec le changement $(PRODUCT_BUNDLE_IDENTIFIER)
. J'ai besoin d'ajouter suffixe .development
À ID d'application normal pour l'ID d'application de développement.
J'ai essayé suivant cette méthode (Utilisez les paramètres définis par l'utilisateur) et modifiez info.plist
Pour obtenir une variable à partir des paramètres définis par l'utilisateur, mais cela ne fonctionne pas.
Erreur est:
L'opération n'a pas pu être complétée. Application "$ (exemple_bundle_id)" est inconnu de l'avant-garde.
Donc, il semble que lorsque vous passez dans le réglage défini par l'utilisateur, il n'est pas interpolée correctement.
J'ai aussi essayé la méthode de mélange d'ajouter par défaut PRODUCT_BUNDLE_IDENTIFIER
Et paramètres définis par l'utilisateur. Par exemple: com.example.app$(EXAMPLE_BUNDLE_ID)
Où EXAMPLE_BUNDLE_ID
= .development
J'essaie également de faire référence à un paramètre défini par l'utilisateur $(EXAMPLE_BUNDLE_ID)
par Direct Ajoutez-le à l'identifiant de l'ensemble dans l'onglet Général cible sous "Identité". Mais cela passe alors à: -- EXAMPLE_BUNDLE_ID-
J'ai aussi essayé dans info.plist
Utilisez $(PRODUCT_BUNDLE_IDENTIFIER)$(EXAMPLE_BUNDLE_ID)
pour la valeur de l'identificateur de paquet. Mais cela donne une erreur similaire:
L'opération n'a pas pu être complétée. Application "COM.Example.app $ $ (exemple_bundle_id)" est inconnu de l'avant-garde.
Encore une fois, cela ressemble à une question d'interpolation.
Quelqu'un sait la solution? J'ai l'air de regarder mais je ne peux pas trouver la réponse.
Ceci facile pour Android car il suffit d'utiliser applicationIdSuffix ".development”
Dans productFlavors
. Mais je ne trouve pas comme ça pour Xcode.
Avez-vous besoin d'avoir différent package name
(Android) et bundle id
(iOS) parce que vous devez utiliser Firebase Auth
brancher?
Dans ce cas pour le projet iOS, vous envisagez d'envisager d'utiliser PlistBuddy
et vous pourriez la définir ajouter un Run Script
dans ton XCode build phases
comme ça
if [ "${CONFIGURATION}" = "Debug" ]; then
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier com.example.developmento.appName" "$PROJECT_DIR/Runner/Info.plist"
echo "Changed bundle id for developement $PROJECT_DIR/Runner/Info.plist"
else
echo "Nothing to do"
fi
Quoi qu'il en soit si vous n'utilisez pas Firebase Auth
, vous pouvez avoir le même identifiant de paquet dans différents projets Firebase.
Si vous avez besoin de différencier le fichier de projets Firebase entre la mise en scène et la production, vous pourriez avoir un look ici:
MISE À JOUR
Ainsi, en suivant la discussion sur op, sachant qu'il suit ceci tutoriel à la configuration flutter flavors
J'ai essayé moi-même de voir où nous avons été bloqués.
Le point de départ est le suivant:
Firebase project
Firebase Auth
module (donc la nécessité de changer l'identifiant de paquet entre projets)GoogleService-Info.plist
Je commence par xcode bundle id
et GoogleService-Info.plist
défini sur la production (juste une option)
Ensuite, j'ai sauve les deux GoogleServices-Info-staging.plist
et GoogleServices-Info-production.plist
Enregistrer dans mon dossier iOS/Runner
Ensuite, j'ai configuré ce script de construction avant le script pour Compile Sources
# Type a script or drag a script file from your workspace to insert its path.
if [ "${CONFIGURATION}" == "Debug" ] || [ "${CONFIGURATION}" == "Debug-Runner-staging" ]; then
echo "Setting up staging firebase environment"
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier com.example.staging.flutterAppAuthFlavours" "${PROJECT_DIR}/Runner/Info.plist"
cp -r "${PROJECT_DIR}/Runner/GoogleService-Info-staging.plist" "${PROJECT_DIR}/Runner/GoogleService-Info.plist"
echo "$(date) staging flavour - Configuration: ${CONFIGURATION}" > "${PROJECT_DIR}/environment.txt"
Elif [ "${CONFIGURATION}" == "Debug-Runner-production" ]; then
echo "Setting up production firebase environment"
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier com.example.flutterAppAuthFlavours" "${PROJECT_DIR}/Runner/Info.plist"
cp -r "${PROJECT_DIR}/Runner/GoogleService-Info-production.plist" "${PROJECT_DIR}/Runner/GoogleService-Info.plist"
echo "$(date) production flavour - Configuration: ${CONFIGURATION}" > "${PROJECT_DIR}/environment.txt"
fi
Et je l'ai appelé Setup Firebase Environment
(vous pouvez appeler cela ce que vous voulez)
Ce script stocke également quelques journaux (avec horodatage) dans un fichier appelé environment.txt
Inside ios
dossier afin de vérifier facilement ce que la construction Xcode a fait
Et maintenant environ Schemes
et Build Configurations
:
J'ai fait deuxBuild Configuration
qui sont la copie exacte de mon Debug Build Configuration
et je les ai appelés
Debug-Runner-staging
Debug-Runner-production
La règle de base est de nommer les configurations de construction comme 'Debug-<your flavor>'
Et vous devez avoir un schéma pour chaque arômes Vous avez, donc j'ai ces:
Runner-staging
dont la course appelle débogueur-coureur-stadification Construire la configurationRunner-production
dont la course appelle débogueur-coureur-production Configuration de la constructionAlors maintenant, si j'appelle flutter run --flavor Debug-staging
J'ai une construction qui fonctionne sur mon mise en scène Projet Firebase.
et si j'appelle flutter run --flavor Debug-production
J'ai une construction qui fonctionne sur mon Production Projet Firebase.
Mettre à jour 2
Juste pour la finale, vous pouvez modifier le paquet d'identité ici aussi ici:
Quoi qu'il en soit, il semble qu'il y ait un Comportement étrange Une fois que vous avez construit un flavour
une seconde fois flutter
commande Construire Correctement la saveur mais exécutez la saveur de la construction de Previos.
En tant que construction avec XCode
et basculer avec des schémas qui fonctionne comme prévu (même la course de la bonne application), je suppose que cela pourrait être un problème de commande à flutter. Donc, je vous suggère d'essayer de produire un problème ici LIENNAGEZ aussi Ceci SO Question/Réponse.
Mise à jour
Après un peu d'Intel, j'ai trouvé que flutter tools
Définissez l'environnement de lancement de l'application avant de construire le projet. Alors quand nous changeons CFBundleIdentifier
à l'intérieur Info.plist
la première fois, la deuxième fois que nous lancons flutter run
Cela prend la valeur modifiée précédente et essayez de lancer cette carte d'identité de l'ensemble pendant la construction, nous le changeons parce que nous construisons une variante différente.
Une solution possible pourrait être de lancer un script qui modifie le CFBundleIdentifier
à l'intérieur Info.plist
Avant d'appeler fluetter run
.
Par exemple, commençant par un Info.plist
avec un jeu d'identité de production de com.example.flutterAppAuthFlavours
nous pourrions faire quelque chose comme ça
Ici, j'ai utilisé la commande sed
juste pour penser différemment, mais vous pouvez toujours appeler notre PlistBuddy
pour faire le changement avant d'appeler flutter run
.