web-dev-qa-db-fra.com

Comment changer $ (produit_bundle_identifier) ​​en Xcode?

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)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.

5
FlutterFirebase

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

enter image description here

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:

Comment choisir entre le développement et la production du projet Firebase basé sur des saveurs de construction?

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:

  • deuxFirebase project
  • Utilisation de Firebase Auth module (donc la nécessité de changer l'identifiant de paquet entre projets)
  • Et bien sûr deux différents GoogleService-Info.plist

Je commence par xcode bundle id et GoogleService-Info.plist défini sur la production (juste une option)

enter image description here

Ensuite, j'ai sauve les deux GoogleServices-Info-staging.plist et GoogleServices-Info-production.plist Enregistrer dans mon dossier iOS/Runner

enter image description here

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)

enter image description here

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

enter image description here

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

enter image description here

  • 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 configuration
  • Runner-production dont la course appelle débogueur-coureur-production Configuration de la construction

enter image description here

enter image description here

Alors 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.

enter image description here

enter image description here

Mettre à jour 2

Juste pour la finale, vous pouvez modifier le paquet d'identité ici aussi ici:

enter image description here

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

enter image description here

enter image description here

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.

7
shadowsheep