Flavours Organization bei Flutter

WofĂŒr sind Aromen?


Stellen Sie sich die Situation vor: Es gibt eine Anwendung mit Analytics. Es gibt ein Entwicklungsteam, Tester und Endbenutzer. Sowohl diese als auch diese verwenden eine Version der Anwendung. Angenommen, wir möchten analysieren, wie interessant Feature A fĂŒr Benutzer ist. Was tun wir in diesem Fall? Wir gehen zur Analyse und sehen, wie viele Verwendungszwecke diese Funktion hatte (z. B. ÜbergĂ€nge zum Bildschirm). Aber was sehen wir: eine unerschwingliche Anzahl von ÜbergĂ€ngen, die fĂŒr das aktuelle Publikum keineswegs unmöglich ist, und alle diese ÜbergĂ€nge waren in einem bestimmten Zeitraum. Wir gehen weiter und verstehen, dass zu diesem Zeitpunkt Tests dieser Funktion durchgefĂŒhrt wurden. Und etwas frĂŒher seine Entwicklung. Gleichzeitig wurden auch Analysen gesendet. Fazit: Die Analyse ist schmutzig und minderwertig.


Hier können Sie das Wort "Analyse" durch ein anderes Wort ersetzen: Push-Benachrichtigungen, Absturzberichte usw.


In dieser Situation werden wir gerettet, indem wir die Anwendung in zwei Versionen aufteilen, die sich minimal unterscheiden, z. B. Bundle ID (Paketname). Entwickler und Tester verwenden nur eine spezielle Entwicklungsversion, und Benutzer verwenden eine Verkaufsversion.


Dies ist nur eine der Aufgaben von Aromen. Hier wird Geschmack verwendet, da dies der Name ist, der von Flutter verwendet wird. Leute, die mit der Android-Entwicklung vertraut sind, haben diesen Mechanismus meiner Meinung nach sofort erkannt.



Flattergeschmack?


Nun, wir haben die Aufgabe herausgefunden. Aber wie soll man es umsetzen? Ist alles so einfach wie sie sagen?
Lassen Sie uns sofort entscheiden: Die Organisation von Aromen ist eine rein native Aufgabe. Informationen darĂŒber sind im Dartcode nicht verfĂŒgbar. Aus diesem Grund werden wir uns fĂŒr die Organisationsmethoden der nativen mobilen Entwicklung zuwenden.


Android


. android. : « buildType?», .


, , :


flavorDimensions "release-type"

    productFlavors {
        dev {
            dimension "release-type"
            applicationIdSuffix  ".dev"
            versionNameSuffix "-dev"
        }

        prod {
            dimension "release-type"
        }
    }

, :


flutter run --flavor dev

android .


: « buildType?» : Flutter buildType . , .


.
, builtTypes. IOS.
:


AndroidIOS
build typesbuild configurations
flavorstargets

— , ( ). flavor’ target’ — .


, , «»...


Runner — .


, target flavors iOS . , Flutter . , . . .


IOS


: (dev, prod, ).


:


  1. .
  2. .
  3. !

.



: dev, prod. :


    #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug-dev.xcconfig"
    #include "Generated.xcconfig"
    #include "common.xcconfig"

    bundle_suffix=.dev
    IDENTIFIER=$(identifier)$(bundle_suffix)

, bundle_suffix.


, Flutter Release Debug. bundle_suffix. , IDE.


IDENTIFIER — .


, :


ios/Flutter/dev.xcconfig
ios/Flutter/prod.xcconfig

XCode ( , ). Runner → New File → Configuration Settings File → .


Build Configurations. .


. Runner.xcworkspace Xcode Project.


«+» Configurations : Release Debug, .


:



, , IOS .


Scheme


, .



. : — Runner.
Edit Scheme .


Info.plist


(: ) — Bundle Identifier Info.plist


$(PRODUCT_BUNDLE_IDENTIFIER)$(bundle_suffix)

...


, , Android , fastlane gym iOS — . , IOS - 
 .


No Provisioning Profile


— . , .


, Info.plist , gym PRODUCT_BUNDLE_IDENTIFIER, .
common.xcconfig IDENTIFIER? .


, , , PRODUCT_BUNDLE_IDENTIFIER.


:


identifier=your.bundle.identifier

include User Defined
IDENTIFIER:


#include "common.xcconfig"

IDENTIFIER=$(identifier)$(bundle_suffix)

Xcode. Build Settings:



Product Bundle Identifier ( Packaging):



:


$(IDENTIFIER)


Info.plist bundle suffix, :


$(PRODUCT_BUNFLE_IDENTIFIER)

. .


bundle id


. Firebase, ( ).


— google-services.json(Google-Services.Info.plist). Android : flavor’ .


IOS - .



, . :



: XCode. . XCode — IDE, Add to target.
.



, . - , .


Run Script (setup firebase ):



, !


, :


# Name of the resource we're selectively copying
GOOGLESERVICE_INFO_PLIST=GoogleService-Info.plist

# Get references to dev and prod versions of the GoogleService-Info.plist
# NOTE: These should only live on the file system and should NOT be part of the target (since we'll be adding them to the target manually)
GOOGLESERVICE_INFO_DEV=${PROJECT_DIR}/${TARGET_NAME}/Firebase/dev/${GOOGLESERVICE_INFO_PLIST}
GOOGLESERVICE_INFO_PROD=${PROJECT_DIR}/${TARGET_NAME}/Firebase/prod/${GOOGLESERVICE_INFO_PLIST}

# Make sure the dev version of GoogleService-Info.plist exists
echo "Looking for ${GOOGLESERVICE_INFO_PLIST} in ${GOOGLESERVICE_INFO_DEV}"
if [ ! -f $GOOGLESERVICE_INFO_DEV ]
then
echo "No Development GoogleService-Info.plist found. Please ensure it's in the proper directory."
exit 1 # 1
fi

# Make sure the prod version of GoogleService-Info.plist exists
echo "Looking for ${GOOGLESERVICE_INFO_PLIST} in ${GOOGLESERVICE_INFO_PROD}"
if [ ! -f $GOOGLESERVICE_INFO_PROD ]
then
echo "No Production GoogleService-Info.plist found. Please ensure it's in the proper directory."
exit 1 # 1
fi

# Get a reference to the destination location for the GoogleService-Info.plist
PLIST_DESTINATION=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app
echo "Will copy ${GOOGLESERVICE_INFO_PLIST} to final destination: ${PLIST_DESTINATION}"

# Copy over the prod GoogleService-Info.plist for Release builds
if [[ "${CONFIGURATION}" == *-prod ]]
then
echo "Using ${GOOGLESERVICE_INFO_PROD}"
cp "${GOOGLESERVICE_INFO_PROD}" "${PLIST_DESTINATION}"
else
echo "Using ${GOOGLESERVICE_INFO_DEV}"
cp "${GOOGLESERVICE_INFO_DEV}" "${PLIST_DESTINATION}"
fi


. , , Flutter ( ). , . .


All Articles